我在一个非常简单的任务上遇到了一个奇怪的问题。
我需要一个非常小的设置来重现问题:
|--------------------------------------|
| 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在这里有一个奇怪的行为,我无法找出导致这个问题的原因。
答案 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
。在设置约束时,请确保在视图控制器中选择了所有子视图。为此,您应该执行以下操作:
Ctrl+A
然后约束将被设置为所有子视图,并且在旋转期间将完美地工作。