我陷入了依赖Autolayout的陷阱.我目前有一个带有大量UIViews的ViewController,并意识到它们在较小的设备(iPhone 4s和5)上被扭曲了.
是否可以在Autolayout中设置相对于设备大小的约束.
例如,我有一个UIView与其他几个UIViews对齐的边.我想将那个UIView的Autolayout中的高度改为设备高度的一半.
解决方法
是.有一种方法可以限制屏幕大小.
它们被称为size classes.
在界面生成器中,在屏幕底部的栏上查看wAny hAny,这些是下拉菜单.选择设备的高度和宽度以及要约束它的方向的组合,以及在该模式下创建约束时,它们将特定于该大小/方向.您还可以在Interface Builder中的检查器,约束编辑器窗格中添加和修改特定于大小的约束.
如果你需要调整一些你无法用尺寸条款完成的角落情况,你可以制作一个约束的IBOutlet并在你的代码中引用它,并在视图出现和修改时修改它,类似于以下示例.这比尝试以编程方式从头开始生成约束更容易,更安全.
注意:通过IB插座修改NSLayout约束时,您只能调整常量字段,而不是乘数,因为乘数在运行时是只读的.因此,无论您使用哪个缩放因子(如果有),都必须乘以用于常量的任何最终值.
@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() }