我陷入了依赖Autolayout的陷阱。我目前有一个带有大量UIViews的ViewController,并意识到它们在较小的设备(iPhone 4s和5)上被扭曲。
是否可以在Autolayout中设置相对于设备大小的约束。
例如,我有一个UIView
与其他几个UIViews
对齐的边缘。我想将那个UIView的Autolayout中的高度改为设备高度的一半。
答案 0 :(得分:10)
是。有一种方法可以限制屏幕大小。
他们被称为size classes。
在Interface Builder中,在屏幕底部的栏中查看 wAny hAny
,这些是下拉菜单。选择设备的高度和宽度以及要约束它的方向的组合,以及在该模式下创建约束时,它们将特定于该大小/方向。您还可以在“界面构建器”中的“检查器”,“约束编辑器”窗格中添加和修改特定于大小的约束。
如果你需要调整一些你无法通过尺寸条款轻松完成的角落情况,你可以制作一个约束的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()
}