22

我注意到,当我在动画块中更改 UILabel 的边界时,它只有在我增加大小时才有效,当我减小大小时,UILabel 只会改变他的大小但不会设置动画。用普通的 UIView 替换 UILabel 可以按预期工作。

注意:将 UILabel 的 contentMode 属性更改为 UIViewContentModeScaleToFill 可以解决此问题,但我仍然不明白为什么在不更改 contentMode 属性的情况下增加大小时它会起作用。

#import "FooView.h"

@interface FooView ()
@property (strong, nonatomic) UILabel   *label;
@property (assign, nonatomic) BOOL       resized;
@end

@implementation FooView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor lightGrayColor];

        self.label = [[UILabel alloc] initWithFrame:(CGRect){0, 0, frame.size}];
        self.label.backgroundColor = [UIColor greenColor];
        [self addSubview:self.label];
        _resized = false;

        UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeSize)];
        tapRecognizer.numberOfTapsRequired = 1;
        [self addGestureRecognizer:tapRecognizer];
    }
    return self;
}

- (void)changeSize {
    [UIView animateWithDuration:0.8
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         CGRect bounds = self.label.bounds;
                         if (self.resized) {
                             bounds.size.height *= 2;
                             bounds.size.width  *= 2;
                         } else {
                             bounds.size.width  /= 2;
                             bounds.size.height /= 2;
                         }
                         self.label.bounds = bounds;
                     }
                     completion:^(BOOL finished) {
                         self.resized = !self.resized;
                     }];
}

@end
4

1 回答 1

25

这是因为UILabel将其图层设置contentsGravity为正在呈现文本的方向,这恰好默认为UIViewContentModeLeft(或@"left")。因此,当图层被告知要进行动画处理时,它首先会查看其内容的重力并以此为基础制作后续动画。因为它看到@"left"了应该在哪里@"resize",所以它假设缩放动画应该从左边开始,但它也必须尊重你给它的约束(边界发生变化),所以你的标签看起来会跳到它的最终大小解决它应该在屏幕中央的位置。

如果您想contentMode不理会,请使用CATransform3D's 并以这种方式缩放标签的图层,而不是更改边界。

于 2013-07-03T19:53:51.490 回答