我陷入了依赖自动布局的陷阱。我目前有一个带大量UIView的ViewController,并意识到它们在较小的设备(iPhone 4s和5)上变形了。

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

例如,我有一个UIView和其他几个UIViews对齐的边缘。我想将一个UIView在Autolayout中的高度更改为等于设备高度的一半。

最佳答案

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

它们被称为size classes

在Interface Builder中,在屏幕底部的栏上显示 wAny hAny ,这些都是下拉菜单。选择设备的高度和宽度以及要限制其方向的组合,然后在该模式下创建约束时,它们将特定于该尺寸/方向。您还可以在检查器的“约束构建器” Pane 的“界面生成器”中添加和修改特定于尺寸的约束。

如果您需要调整一些无法通过大小规则轻松完成的特殊情况,则可以制作一个IBOutlet作为约束,并在代码中引用它,并在 View 出现和更改时对其进行修改,类似于下面的例子。这比尝试以编程方式从头生成约束要容易和安全得多。

注意:通过IB socket 修改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()

}

关于objective-c - 设置相对于设备大小的自动布局约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29179537/

10-14 16:54
查看更多