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的所有子视图。 为此,您应该执行以下操作:
- 点击你的主视图控制器的视图
- 按下
Ctrl+A
- 点击解决自动布局问题
- select添加您的视图控制器中的缺less约束
然后约束将被设置为所有的子视图,并将在旋转过程中完美地工作。