如何强制UIView的layoutSubviews。

时间:2011-09-27 14:03:09

标签: ios iphone uiview uiviewcontroller layoutsubviews

我有一个自定义的UIView,它有一个专用的,手动设置的纵向和横向框架,因为autoresizingMasks在我的情况下不起作用。

我将此框架设置为:

 - (void)viewWillAppear:(BOOL)animated

它按预期工作。

现在我的问题是,我的UIView还有子视图,也有专门的肖像/风景位置。

我将这些子视图放在:

- (void)layoutSubviews

如果我现在将viewController保留在例如纵向方向,请在另一个viewController上旋转到横向,然后返回到此viewController我看到我的视图已正确调整大小,但是我的视图的子视图,在layoutSubviews中定位的位置尚未重新定位,但在视图已经出现后以动画方式调整大小。

我在viewDidAppear中什么也没做,我已经尝试过调用

 - (void)layoutIfNeeded

以及:

 - (void)setNeedsLayout

在viewWillAppear中,但它似乎没有改变任何东西。

任何想法我做错了什么?

感谢。

4 个答案:

答案 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来重新绘制选定的视图,我在我的情况下执行了该操作,并且它运行良好。