故事板和Swift中的不同肖像/风景视图

时间:2014-09-21 12:48:31

标签: swift orientation autolayout xcode6

我正在使用storyboard和Xcode 6设计应用程序视图但我面临这个问题:我想为纵向和横向模式分配不同的子视图位置。例如:

Portrait Landscape

从现在开始,我已经使用willRotateToInterfaceOrientation和状态栏以编程方式实现了此操作,以获得ipad方向。

使用Xcode 6,纵向和横向的iPhone布局不同,但iPad(常规,常规)的布局相同。有可能实现那些有约束的位置吗?

3 个答案:

答案 0 :(得分:8)

是的,你可以通过约束来做到这一点。

首先,您需要为superview创建约束,而不是最近的视图。相邻视图将改变位置,因此我们不希望约束相对于其他视图。有关如何设置约束的示例,请参阅下面的屏幕截图。

Constraint Setup

接下来,将您要修改的约束链接到IBOutlets,以便我们可以以编程方式修改它们。对于您的示例,这些将​​是约束:

@IBOutlet var greenViewTrailingConstraint: NSLayoutConstraint!
@IBOutlet var greenViewBottomConstraint: NSLayoutConstraint!

@IBOutlet var redViewTopConstraint: NSLayoutConstraint!
@IBOutlet var redViewLeadingConstraint: NSLayoutConstraint!
@IBOutlet var redViewBottomConstraint: NSLayoutConstraint!

@IBOutlet var blueViewTrailingConstraint: NSLayoutConstraint!
@IBOutlet var blueViewTopConstraint: NSLayoutConstraint!
@IBOutlet var blueViewLeadingConstraint: NSLayoutConstraint!

最后,根据UIInterfaceOrientation更新约束常量。再次,使用您的示例,代码看起来像这样:

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    let padding: CGFloat = 16.0

    // since we're calling this before the rotation, the height and width are swapped
    let viewHeight = self.view.frame.size.width
    let viewWidth = self.view.frame.size.height

    // if landscape
    if UIInterfaceOrientationIsLandscape(toInterfaceOrientation) {
        greenViewTrailingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
        greenViewBottomConstraint.constant = padding

        blueViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0)
        blueViewTrailingConstraint.constant = padding
        blueViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0)

        redViewTopConstraint.constant = padding
        redViewBottomConstraint.constant = (viewHeight/2.0) + (padding/2.0)
        redViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
    } else { // else portrait
        greenViewBottomConstraint.constant = (viewHeight/2.0) + (padding/2.0)
        greenViewTrailingConstraint.constant = padding

        blueViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0)
        blueViewTrailingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
        blueViewLeadingConstraint.constant = padding

        redViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
        redViewBottomConstraint.constant = padding
        redViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0)
    }
}

答案 1 :(得分:1)

我知道这是一个旧帖子,但仅供参考。我尝试了以下步骤,它按预期工作。

步骤1。选择View controller,从size class control中选择任意一个。 并在此模式下添加视图。 Any Mode 第2步。将模式更改为从尺寸类控件纵向所有iPhone,为纵向模式的视图添加约束。 Potrait mode 第三步。同样,将模式更改为横向显示所有iPhone,为横向模式的视图添加约束。

请注意:现在,纵向和横向的约束是独立的

答案 2 :(得分:0)

按下约束常量旁边的加号“+”,为不同的屏幕添加变体:

enter image description here

相关问题