StoryBoard布局注意事项
对于一个懒人来说,相对于代码写界面,我更喜欢使用可是化布局,可以实时看到,可是终究还是代码执行,所以很多东西还需要在代码中去做,所以我还是鼓励打家多用代码编写界面。
1.生命周期注意事项
不要在Controller的viewWillLoad中去使用来自于可视化布局布局和尺寸(特别是frame或bound)
原因:在这几个方法中,可视化布局的约束并没有生效,包括再wiewDidAppear这里,同样是无效的,所以它的视图的尺寸为原布局尺寸(取决于选择的基本布局模型)
后果:欲新添加的基于可视化bounds的新视图的布局与想像的不一样(布局取决于使用xib的大小)。
例如:storyboard中基于iphone7添加的等宽子视图view1,约束为等宽,我在wiewdidLoad中又在view1中添加一个view2=UIView(frame:view1.bouns),想着view2等宽view1,如果在iphone7(或屏幕宽度为375)中是可以的,可是其他宽度的手机就会出错,因为view2的宽度始终为原view1的宽度375,不会变化,除非你给他添加约束。
正确的姿势:a.在这几个方法中使用,添加约束代码,不要使用frame布局。
如何获取约束更新后的坐标信息
一.Controller中
1.在viewDidLoad中获取
2.执行setNeedLayout和layoutIfNeeded方法(推荐)
比如:在viewDidload使用frame之前先调用
// 针对于Controller 如果是自定义View 在需要获取正确frame之前执行,替换下面代码前面的View对象
self.view.setNeedLayout(); // 设置更新标志
self.view.layoutIfNeed; // 实际更新
一般的控制器调用方法顺序:
override func viewDidLoad() {
super.viewDidLoad()
//self.updateViewConstraints() //即使调用也不会立即更新,也得再viewWillAppear后更新
// 所有可以使用上面提到的两个方法跟新layout到正确值
view1 = self.view.viewWithTag(20)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
//新添加约束请在这里更新,确保该view的translatesAutoresizingMaskIntoConstraints属性已设置为NO
//有约束布局更改会自动调用
override func updateViewConstraints() {
super.updateViewConstraints()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
理解参考【ios8自动布局相关】
2.在代码中添加约束
确保改View的translatesAutoresizingMaskIntoConstraints属性已设置为NO
a.在对应的View的重绘方法中去添加,并更新布局调用。【View的约束相关方法】
b.建议重写控制器updateViewConstraints()方法,在中添加