在动画父UIView的帧(大小)动画时,自动调整UILabel的帧

时间:2011-10-27 15:42:21

标签: ios cocoa-touch core-animation

我有一个父UIView,其子UIView(在下面的代码中使用UILabel),其框架设置为父级边界,其autoresizingMask设置为灵活的宽度和高度:

UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
UILabel* childLabel = [[UILabel alloc] initWithFrame:parentView.bounds];
childLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
childLabel.textAlignment = UITextAlignmentCenter;
childLabel.text = @"Hello";

我希望能够为父视图的框架设置动画,特别是其大小,并将子视图调整为动画的一部分:

[UIView animateWithDuration:1.0 animations:^{ parentView.frame = CGRectMake(0, 0, 160, 240); }];

作为这个动画的结果,我希望UILabel的文本与父视图的动画一起动画,所以在视觉上你会看到文本从(160,240)居中移动到(80,120) 。但是,不会动画显示子视图的帧会立即设置为动画结束时应该具有的值,因此您可以看到文本的位置在动画开始时立即跳转。

有没有办法让子视图作为动画的一部分自动调整大小?

1 个答案:

答案 0 :(得分:20)

我并不完全理解正在发生的事情,但我认为核心问题是UIKit不想在动画的每一帧都重新渲染文本,因此UILabel的内容不是不可动画。默认情况下,UILabel的contentMode属性是UIViewContentModeRedraw,这意味着一旦设置了属性,它就会以目标大小重绘UILabel。

如果您将contentMode更改为UIViewContentModeCenter,则内容将不会重绘并保持在UILabel的中心位置。

childLabel.contentMode = UIViewContentModeCenter;