10

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

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

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

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

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

4 回答 4

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;
于 2015-01-24T12:43:14.083 回答
0

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

于 2014-02-23T19:23:01.040 回答
0

问题不在于 UILabel 没有为其调整大小设置动画,而是文本没有设置动画。如果你给标签一个不同的背景颜色,你会发现它确实是动画的,它只是跳转到位置的文本。

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

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

于 2013-08-08T19:27:49.680 回答
0

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

  1. 单击主视图控制器的视图
  2. Ctrl+A
  3. 单击解决自动布局问题
  4. 选择在您的视图控制器中添加缺少的约束

然后将约束设置为所有子视图,并在旋转期间完美运行。

于 2014-04-02T12:19:25.380 回答