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

时间:2013-06-10 11:26:23

标签: ios objective-c uilabel autolayout

我在一个非常简单的任务上遇到了一个奇怪的问题。

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

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

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

Constraints for UILabel:
Leading Space to superview = 0
Trailing Space to superview = 0
Fixed Height constraint (e.g. 80pt)
Top Space constraint (e.g. 50pt)

The UIView subview has the same constraint types (the values for height and top space differs).

所以我对此设置的期望是,两个子视图将采用其父级的全宽,因为我们定义了前导和尾随空间应该为零。因此,如果更改父视图的宽度,子视图的宽度也应该更改,以保持对齐。

假设父视图的尺寸为200x400 pt。当我在肖像中构建并运行我的示例时,一切看起来都不错。当我旋转到风景时,一切看起来都很好。父视图宽度甚至子视图宽度变大。但是现在当我旋转回到肖像时,uilabels宽度立即获得其目标宽度而没有任何动画:

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

父视图宽度和uiview子视图宽度正确设置动画。它唯一的uilabel在这里有一个奇怪的行为,我无法找出导致这个问题的原因。

4 个答案:

答案 0 :(得分:1)

我的建议是:

如果您已将子视图子类化,请使用- (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;

答案 1 :(得分:0)

问题不在于UILabel没有动画调整大小,而是文本没有动画。如果您要为标签指定不同的背景颜色,您会发现它确实具有动画效果,而且它只是跳到位置的文本。

解决这个问题的一种方法是在没有动画的情况下更改标签的宽度,并将其移动X点,其中X是起始宽度和结束宽度之差的一半,然后只是为其位置设置动画。

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

答案 2 :(得分:0)

我记得,对于约束,您应该提供更多规范,但对于这样简单的UI元素,我建议使用UIViewAutoresizing掩码。它们更简单,定义更短。在您的情况下,只需使用UIViewAutoresizingFlexibleWidth

答案 3 :(得分:0)

最好在autolayout中设置story board。在设置约束时,请确保在视图控制器中选择了所有子视图。为此,您应该执行以下操作:

  1. 单击主视图控制器的视图
  2. Ctrl+A
  3. 点击解决自动布局问题
  4. 在“视图控制器”中选择“添加缺少的约束”
  5. 然后约束将被设置为所有子视图,并且在旋转期间将完美地工作。