Iphone 设置UILabel大小减小的动画

Iphone 设置UILabel大小减小的动画,iphone,animation,Iphone,Animation,当增加标签的高度时,一切都很顺利。减小时,标签会立即更改大小,然后通过动画重新定位 @interface @property (nonatomic, retain) IBOutlet UILabel *explanationLabel; @implementation CGRect frmExpl = explanationLabel.frame; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0

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

@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没有这样的问题

是否有任何特殊的方法来设置UILabel大小减小的动画


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

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

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

尝试以下方法:

- (void)animate:(id)sender
{
    ...
    CGRect newBounds = testLabel.bounds;
    newBounds.size.height += 50;
    testLabel.bounds = newBounds;
    ...
}

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

使用
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);
    }];
}];

你们从哪里得到frmExpl?从nib文件中设计的标签框架。更新。增加边界确实会更改帧,但帧在屏幕上保持不变。递减界限有效。但这不是解决方案,因为我需要增加和减少。我怀疑这是框架中的一个bug。没错,它可能是一个bug。你能改变你的视图层次结构是否有一个蓝色背景的UIView,然后是一个固定大小的UILABEL,它只有它的支柱和弹簧设置在UIView的中间浮动。考虑到UIView的动画设置正确,这可能是一个解决方案。它对我有效,但会影响其他动画,如淡入和淡出UIView。你能告诉我如何解决这个问题,为什么这些动画冲突。我对你的答案投了赞成票。在标签上使用仿射翻译确实有一些丑陋的副作用,比如扭曲标签上的文字。这不是一个有用的解决方案。