【问题标题】:Different portrait/landscape views in storyboard and Swift故事板和 Swift 中的不同纵向/横向视图
【发布时间】:2014-09-21 12:48:30
【问题描述】:

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

从现在开始,我已经通过 willRotateToInterfaceOrientation 和状态栏以编程方式实现了这一点,以获取 ipad 方向。

在 Xcode 6 中,iPhone 的纵向和横向布局不同,但对于 iPad(常规、常规)是相同的。是否有可能在有限制的情况下获得这些职位?

【问题讨论】:

    标签: swift orientation autolayout xcode6


    【解决方案1】:

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

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

    接下来,将您要修改的约束链接到 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)
        }
    }
    

    【讨论】:

    • 不错的解决方案!!但是,我只是想知道在设备旋转期间以编程方式添加和删除约束是否很好。
    • @RashmiRanjanmallick,好问题!但是,我们不会添加/删除约束。我们只是在修改它们的常量。修改约束常量是常见的做法,尤其是在 UIView 动画或设备旋转中。
    • 谢谢,我只是想知道为什么他们没有像选择纵向模式并设置纵向布局,选择横向模式并设置横向布局那样制作故事板。
    • @fullMoon 他们确实做到了。这是一个古老的答案。现在您可以将大小类用于不同的横向/纵向方向。
    【解决方案2】:

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

    步骤 1。选择视图控制器,从大小类控件中选择任何一个。 并在此模式下添加视图。 Any Mode 第2步。将模式从尺寸类控制更改为纵向所有 iPhone,为纵向模式的视图添加约束。 Potrait mode 第三步。同样将模式更改为横向所有 iPhone,为横向模式的视图添加约束。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 2012-05-02
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        • 2014-11-15
        相关资源
        最近更新 更多