设置相对于设备大小的Autolayout约束

Oni*_*han 7 objective-c autolayout swift

我陷入了依赖Autolayout的陷阱.我目前有一个带有大量UIViews的ViewController,并意识到它们在较小的设备(iPhone 4s和5)上会失真.

是否可以在Autolayout中设置相对于设备大小的约束.

例如,我有一个UIView带有其他几个UIViews对齐的边.我想将那个UIView的Autolayout中的高度改为设备高度的一半.

cle*_*ght 10

是.有一种方法可以限制屏幕大小.

它们被称为大小类.

在Interface Builder中,查看屏幕底部的栏wAny hAny,它们是下拉列表.选择设备的高度和宽度以及要约束它的方向的组合,以及在该模式下创建约束时,它们将特定于该大小/方向.您还可以在Interface Builder中的检查器,约束编辑器窗格中添加和修改特定于大小的约束.

如果你需要调整一些你无法通过大小条款方便地完成的角落情况,你可以制作一个约束的IBOutlet并在你的代码中引用它,并在视图出现和修改时修改它,类似于以下示例.这比尝试以编程方式从头开始生成约束更容易,更安全.

注意:通过IB插座修改NSLayout约束时,您只能调整constant字段,而不是multiplier因为multiplier在运行时只读.因此,无论您使用哪个缩放因子(如果有),都必须乘以用于常量的任何最终值.

@IBOutlet var tableYTopConstraint : NSLayoutConstraint!

override func viewWillAppear(animated: Bool) {
     adjustViewLayout(UIScreen.mainScreen().bounds.size)
}

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        adjustViewLayout(size)
}

func adjustViewLayout(size: CGSize) {
    switch(size.width, size.height) {
    case (320, 480):                        // iPhone 4S in portrait
        tableYTopConstraint.constant = 0
    case (480, 320):                        // iPhone 4S in landscape
        tableYTopConstraint.constant = 0
    case (320, 568):                        // iPhone 5/5S in portrait
        tableYTopConstraint.constant = 0
    case (568, 320):                        // iPhone 5/5S in landscape
        tableYTopConstraint.constant = 0
    case (375, 667):                        // iPhone 6 in portrait
        tableYTopConstraint.constant = 0
    case (667, 375):                        // iPhone 6 in landscape
        tableYTopConstraint.constant = 0
    case (414, 736):                        // iPhone 6 Plus in portrait
        tableYTopConstraint.constant = 0
    case (736, 414):                        // iphone 6 Plus in landscape
        tableYTopConstraint.constant = 0
    default:
        break
    }
    view.setNeedsLayout()

}
Run Code Online (Sandbox Code Playgroud)