自动布局和设备方向

7
我正在开发一个应用程序,它支持纵向和横向模式。我使用自动布局来安排我的视图。经过阅读许多文章后,我意识到开发人员通常使用以下两种方法之一。
1. 第一种方法:实现UIViewController:updateConstraints方法,并根据设备方向更新约束。 2. 第二种方法:实现UIViewController:viewWillLayoutSubviews方法,并根据设备方向更新约束。
请问哪种方法是最好的?我一直在寻找结合自动旋转和自动布局的最佳实践,但还没有找到。谢谢。
4个回答

6
我会使用这个UIViewController的方法:- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;。在旋转时调用,并从那里调用-setNeedsUpdateConstraints。 如果您需要进行额外的计算或管理约束,请添加。
- (void)updateViewConstraints
{
    [super updateViewConstraints];
    // do calculations if needed, like set constants
}

我认为在willAnimateRotationToInterfaceOrientation方法中没有必要计算约束,因为可以通过检查当前设备方向在updateViewConstraints中完成。 - rokridi
1
也许我的回答不够清晰,我的意思是计算应该在updateViewContraints方法中完成。 - Fr4ncis
我确认计算应该在updateViewContraints方法中完成。但是当我在willAnimateRotationToInterfaceOrientation方法中调用setNeedsUpdateConstraints方法时,我意识到updateViewConstraints被调用了多次。 - rokridi
willAnimateRotationToInterfaceOrientation已经被弃用,请使用“viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)”代替。但请注意,在视图更改之前将调用updateViewConstraints。 - EckhardN

5
最好的方法是两者都不用。相反,正确配置约束条件,以便在旋转时不需要进行编程更改。自动布局运行时将保持视图在您已经指定的位置。
除了更改.constant的值之外,更新约束条件会对性能产生真正的影响,应该避免使用。
不需要使用viewWillLayoutSubviews。自动布局方法是updateViewConstraints(对于视图控制器)和updateConstraints(在视图中)。

4
有时仅仅配置限制条件是不够的,因为当从横屏切换到竖屏或相反方向时,布局方面可能会完全改变。 - rokridi
1
在这种情况下,您需要使用上面由@Fr4ncis描述的更新约束方法之一。 - Max MacLeod
刚看到这个。这可能对你有用:https://dev59.com/LGMm5IYBdhLWcg3wO9Aq - Max MacLeod
是的,我刚看到了,我认为它与@Fr4ncis的解决方案类似。 - rokridi

1
我认为最好的方法是通过检查设备方向,在-(void)updateViewConstraints中更新约束。在willAnimateRotationToInterfaceOrientation中不需要调用setNeedsUpdateConstraints,因为当设备方向改变时,它会被iOs自动调用。感谢大家的努力。

0

适用于iOS8及以上版本

来自以下文档:

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection
          withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

一个标准的视图控制器可能会使用这个方法来改变它所管理的视图的约束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接