如何强制UIView的layoutSubviews.

mye*_*l0w 50 iphone uiviewcontroller uiview ios layoutsubviews

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

我将此框架设置为:

 - (void)viewWillAppear:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)

它按预期工作.

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

我将这些子视图放在:

- (void)layoutSubviews
Run Code Online (Sandbox Code Playgroud)

如果我现在离开我在的viewController 纵向,旋转到另一个的viewController横向的,然后回来这个的viewController我看到我的观点得到了正确的调整,但我的观点的子视图,其中获得定位在layoutSubviews不重新定位还没有,但在视图已经出现后以动画方式调整大小.

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

 - (void)layoutIfNeeded
Run Code Online (Sandbox Code Playgroud)

以及:

 - (void)setNeedsLayout
Run Code Online (Sandbox Code Playgroud)

在viewWillAppear中,但它似乎没有任何改变.

我有什么想法我做错了吗?

谢谢.

小智 93

今天有类似的问题.我先打电话解决了

  • -setNeedsLayout:设置视图需要布局的标志,然后调用
  • -layoutIfNeeded:立即检查标志,并且 - 之前手动设置 - 作为结果调用layoutSubviews.

不知道这是不是最好的方法,但它有效;)


Chr*_*les 5

我建议在viewDidLoad中设置初始帧,然后更改视图帧以进行方向更改

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Run Code Online (Sandbox Code Playgroud)

你不需要layoutSubviews中的任何显式动画(不确定你是否有任何动画,但听起来像它),因为任何帧更改都将同步到旋转动画.

在屏幕外时,仍应旋转方向,以便在再次向后切换到屏幕上时,应正确定位视图.

我还建议观看WWDC 2010 Session 123"构建动画驱动的UI",它更详细地介绍了这些内容.


小智 5

在 swift 3 @iOS 10.1

override func viewWillAppear(animated: Bool){

    super.viewWillAppear(animated)
    view.setNeedsLayout()
}
Run Code Online (Sandbox Code Playgroud)

运行完美

  • Apple:如果您重写此方法,则必须在实现中的某个时刻调用 super。所以你真的应该调用 super,即使它没有工作。 (2认同)