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



我有一个父UIView,它有子UIView (UILabel在下面的代码中使用),其框架被设置为父UIView的边界,其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)。然而,在动画结束时,子视图的帧被立即设置为它应该有的值,而不是动画,所以当动画开始时,你会看到文本的位置立即跳转。

是否有一种方法可以让子视图自动调整大小作为动画的一部分?

我不完全有我的头周围发生了什么,但我认为核心问题是UIKit不想要重新渲染文本的每一帧动画,所以一个UILabel的内容是不可动画的。默认情况下,UILabel的contentMode属性是UIViewContentModeRedraw,这意味着一旦设置了该属性,它就会以目标大小重新绘制UILabel。

如果你改变contentMode为UIViewContentModeCenter,内容将不会重新绘制,并将保持在UILabel的中心。

childLabel.contentMode = UIViewContentModeCenter;

最新更新