我有一个自定义的UIView,它有一个专用的,手动设置的纵向和横向框架,因为autoresizingMasks在我的情况下不起作用。
我将此框架设置为:
- (void)viewWillAppear:(BOOL)animated
它按预期工作。
现在我的问题是,我的UIView还有子视图,也有专门的肖像/风景位置。
我将这些子视图放在:
- (void)layoutSubviews
如果我现在将viewController保留在例如纵向方向,请在另一个viewController上旋转到横向,然后返回到此viewController我看到我的视图已正确调整大小,但是我的视图的子视图,在layoutSubviews中定位的位置尚未重新定位,但在视图已经出现后以动画方式调整大小。
我在viewDidAppear中什么也没做,我已经尝试过调用
- (void)layoutIfNeeded
以及:
- (void)setNeedsLayout
在viewWillAppear中,但它似乎没有改变任何东西。
任何想法我做错了什么?
感谢。
答案 0 :(得分:89)
今天有类似的问题。我通过先致电
解决了这个问题-setNeedsLayout
:设置视图需要布局的标志,然后调用-layoutIfNeeded
:立即检查标志,并且 - 之前手动设置 - 因为调用了layoutSubviews。不知道这是不是最好的方法,但它有效;)
答案 1 :(得分:5)
我建议在viewDidLoad中设置初始帧,然后在
中更改方向更改的视图帧- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
在layoutSubviews中你不需要任何明确的动画(不确定你是否有任何动画,但听起来像它),因为任何帧变化都会同步到旋转动画。
当关闭屏幕时,方向仍应旋转,因此当您再次在屏幕上转换时,应正确定位视图。
我还建议观看WWDC 2010 Session 123“构建动画驱动的用户界面”,其中更详细地介绍了这些内容。
答案 2 :(得分:4)
在swift 3 @iOS 10.1
(old, friend)
运行完美
答案 3 :(得分:-1)
对我来说,有效的是[self.view setNeedsDisplay]
。这会调用整个视图的重绘。您还可以通过在特定视图上调用setNeedsDisplay
来重新绘制选定的视图,我在我的情况下执行了该操作,并且它运行良好。