2014-09-21 178 views
6

我使用故事板和Xcode 6来设计应用程序视图,但我面临的问题是:我想为纵向和横向模式分配不同的子视图位置。例如:故事板和swift中的不同肖像/风景视图

Portrait Landscape

既然现在我已经编程方式与willRotateToInterfaceOrientation和状态栏实现了这一拿到iPad的方向。

使用Xcode 6,纵向和横向的iPhone布局是不同的,但iPad(普通,普通)的布局是相同的。有可能通过约束来实现这些职位?

谢谢。

回答

7

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

首先,您需要为超级视图创建约束,而不是最近的视图。相邻视图将会改变位置,所以我们不希望约束与其他视图相关。有关如何设置约束的示例,请参见下面的屏幕截图。

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) 
    } 
} 
+0

很好的解决方案! !但是,我只是想知道在设备旋转过程中以编程方式添加和删除约束是否好。 – 2015-05-19 06:38:56

+0

@RashmiRanjanmallick,好问题!但是,我们不添加/删除约束。我们只是修改它们的常量。修改约束常量是常见操作,特别是在UIView动画或设备旋转中。 – 2015-05-19 17:58:40

+0

谢谢,我只是想知道他们为什么没有像选择肖像模式一样制作故事板并设置肖像布局,并选择了横向模式并设置了横向布局。 – fullMoon 2017-03-01 10:02:18

1

我知道这是一个老的文章,但,只是info.I尝试下面的步骤,它是按预期工作。

Step1。选择视图控制器,从大小类控件中选择任意。 并在此模式下添加视图。 Any Mode Step2。将模式更改为从尺寸等级控制中纵向显示所有iPhone,为纵向模式的视图添加约束。 Potrait mode Step3。类似地更改模式以横置所有iPhone,为横向模式的视图添加约束。

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

0

按加号“+”恒约束的旁边,并添加变化对于不同的屏幕:

enter image description here