代码之家  ›  专栏  ›  技术社区  ›  Pablo

设置UILabel大小减小的动画

  •  9
  • Pablo  · 技术社区  · 14 年前

    当增加标签的高度时,一切都很好和顺利。减小时,标签会立即更改大小,然后使用动画重新定位。

    @interface
    @property (nonatomic, retain) IBOutlet UILabel *explanationLabel;
    
    @implementation
    CGRect frmExpl = explanationLabel.frame;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.75];
    
    frmExpl.size.height -= height;
    explanationLabel.frame = frmExpl;
    
    [UIView commitAnimations];  
    

    我试过用UIView替换UILabel,当然UIView没有这个问题。

    下面是一个演示所描述问题的最小项目。 Download

    3 回复  |  直到 14 年前
        1
  •  2
  •   Matthew Leffler    14 年前

    我认为你想要改变的是界限,而不是框架。从文档中:

    “边界矩形确定其框架矩形内视图坐标系中的原点和比例,并以点为单位进行测量。设置此属性会相应地更改frame属性的值。“-UIView Class;边界属性

    尝试以下操作:

    - (void)animate:(id)sender
    {
        ...
        CGRect newBounds = testLabel.bounds;
        newBounds.size.height += 50;
        testLabel.bounds = newBounds;
        ...
    }
    
        2
  •  15
  •   davehayden    13 年前

    问题是一旦UILabel的大小改变,它就会重新绘制自己(它无法重绘动画的每一帧,因为文本渲染是在CPU上进行的,而不是在运行UIView动画的GPU上进行的。)您可以通过将标签的contentMode属性更改为(例如,UIViewContentModeCenter)来防止它重绘。

        3
  •  2
  •   trapper    12 年前

    使用 CGAffineTransform

    [UIView animateWithDuration:1.0 animations:^{
        // Scale down 50%
        label.transform = CGAffineTransformScale(label.transform, 0.5, 0.5);
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:1.0 animations:^{
            // Scale up 50%
            label.transform = CGAffineTransformScale(label.transform, 2, 2);
        }];
    }];