AutoLayout和UILabel调整animation在设备旋转时无法正常工作

我有一个非常简单的任务奇怪的问题。

我需要一个非常小的设置来重现问题:

|--------------------------------------| | Parent View | | | ||------------------------------------|| || UILabel || ||------------------------------------|| | | | | ||------------------------------------|| || UIView || ||------------------------------------|| | | | | |--------------------------------------| 

在上面的例子中,我们有一个包含2个子视图的父视图 – > UILabel和一个简单的UIView。 我使用自动布局应用上面显示的布局:

 Constraints for UILabel: Leading Space to superview = 0 Trailing Space to superview = 0 Fixed Height constraint (eg 80pt) Top Space constraint (eg 50pt) The UIView subview has the same constraint types (the values for height and top space differs). 

所以我期望这个设置是,这两个子视图将采用其父母的全部宽度,因为我们定义的前后空格应该是零。 所以如果改变父视图的宽度,子视图的宽度也应该改变,以保持alignment。

可以说父视图的尺寸是200×400磅。 当我build立并运行我的示例肖像一切看起来不错。 当我旋转到风景,一切仍然看起来不错。 父视图宽度甚至子视图宽度都变大了。 但现在当我旋转回肖像uilabels宽度立即得到其目标宽度没有任何animation:

 |--------------------------------------| | Parent View | | | | (immediately has target size) | | |--------------| | | | UILabel | | | |--------------| | | | | (this subview is still | | animating its width) | | |------------------------------| | |-->| UIView |<--| | |------------------------------| | | | | | |--------------------------------------| 

父视图的宽度和uiview子视图的宽度都是正确的animation。 它只有在这里有一个奇怪的行为uilabel,我不能找出是什么原因导致这个问题。

我的build议是:

如果你已经子视图的父视图使用- (void)layoutSubviews

 - (void)layoutSubviews { label.frame = CGRectMake(leftInset, labelY, parentView.frame.size.width - leftInset*2, labelHeight); childView.frame = CGRectMake(leftInset, childViewY, parentView.frame.size.width - leftInset*2, childHeight); } 

如果你没有子类化父视图,你可以使用autoresizingMask

 label.autoresizingMask = UIViewAutoresizingFlexibleWidth; childView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

问题不在于UILabel不是animationresize,而是文字不animation。 如果你要给标签赋予不同的背景颜色,你会发现它确实有animation效果,而这只是跳转到的位置。

解决这个问题的一个方法是改变标签的宽度而不用animation,然后用X点移动它,其中X是开始和结束宽度之差的一半,然后animation它的位置。

这个方法对于你的代码唯一的问题是,我不相信你能用自动布局来做到这一点。

我记得,对于约束,你应该提供一些更多的规格,但对于这样简单的UI元素,我会build议使用UIViewAutoresizing蒙板。 他们更简单,定义更短。 在你的情况下,只需使用UIViewAutoresizingFlexibleWidth

最好在story board设置自动autolayout 。 请确保在设置约束条件时,您是在视图控制器中select的所有子视图。 为此,您应该执行以下操作:

  1. 点击你的主视图控制器的视图
  2. 按下Ctrl+A
  3. 点击解决自动布局问题
  4. select添加您的视图控制器中的缺less约束

然后约束将被设置为所有的子视图,并将在旋转过程中完美地工作。