2011-10-27 84 views
13

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

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的文本与父视图的a一起动画nimation,所以在视觉上你会看到文本从(160,240)中心移动到(80,120)。但是,不是动画,而是显示子视图的框架立即被设置为它在动画结束时应该具有的值,所以当动画开始时,您会看到文本的位置立即跳转。

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

回答

20

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

如果将contentMode更改为UIViewContentModeCenter,则内容将不会重绘并保持居中于UILabel。

childLabel.contentMode = UIViewContentModeCenter; 
+1

这是很好的信息。 UIViewContentModeCenter适用于我实际需要的功能 - 让文本在父视图的框架缩小或增长时保持居中。谢谢。 –

+0

太棒了!谢谢! – Kjuly