我在弄清楚XIB
上的auto-contraints
设置何时在视图设置过程中应用时遇到了一些问题。
更多解释:
- 我已经为视图设置了
XIB
- 我将"模拟指标"大小设置为iPhone 3.5英寸
- 我已将自动约束添加到此视图中的子视图
- 在视图控制器中,我根据
viewDidLoad
方法中的子视图(IBOutlet
)frames/bounds
执行某些操作 - 在视图中,我根据
awakeFromNib
方法中的子视图(IBOutlet
)frames/bounds
执行某些操作
在这两种方法(ViewController::viewDidLoad and View::awakeFromNib
)中,已加载IBOutlet视图,但尚未应用约束。当使用更大的模拟器(如iPhone 6模拟器)时,实际帧仍然设置为iPhone 3.5英寸大小(宽度320)
这些自动约束何时应用?需要子视图的实际框架/边界的任何必要操作应在何时进行?
我使用XCode 6.3,Swift(1.2)
约束在layoutSubviews
方法中应用。因此,如果你想在UIView
子类中应用它们之后做一些事情,请重写方法:
override func layoutSubviews() {
super.layoutSubviews()
//the frames have now their final values, after applying constraints
}
在UIViewController
子类中,使用viewDidLayoutSubviews
用于相同的目的:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
//the frames have now their final values, after applying constraints
}
请注意,如果向视图添加了自动布局约束,则不应为视图设置frame
/bounds
。
注意Xcode 8:如果您使用自动布局,您可能会遇到新功能的问题:视为[任何设备]。当你在另一台设备(模拟器)上测试你的应用程序并推断出屏幕时,该设备的屏幕边界将应用于viewWillLayoutSubviews。
您可以使用方法
override func layoutSubviews() {
super.layoutSubviews()
//the frames have now their final values, after applying constraints
}
但是,在视图的生命周期中,这种方法将被调用多次,例如方向更改或移入和移出视图,因此需要处理此问题。