AutoLayout
AutoLayout
传统的是采用设置frame的布局方式的思维开发界面,但是随着苹果设备屏幕尺寸的碎片化,这种方式逐渐被摒弃,在大多数情况下,比如页面支持屏幕旋转的话,这种设定frame的方式就会完全失效。很多人习惯在ViewDidload里面初始化控件,但是viewController要在viewWillLoyoutSubviews的时候才真正地确定view和子view的frame,所以在没有确定view的frame时去修改view的frame是不友好的,效果也是无法预料的。如果我们用设置Frame的方式布局的话就必须在viewWillLayoutSubviews中重新设定view的坐标大小,布局逻辑会变得更不清晰。而使用AutoLayout则不会有这些问题
AutoLayout的使用:
可以通过在storyBoard中通过拉线的方式,通过苹果的可视化界面就可以实现AutoLayout布局。另一种方式是通过纯代码的方式实现AutoLayout自动布局,即NSLayoutConstraint。
纯代码:
APLLE官方API NSLayoutConstraint
1、Autoresizing Mask
在使用AutoLayout时需要将setTranslatesAutoresizingMaskIntoConstraints属性设置为NO。它默认为YES。当它为YES时系统会自动将Autoresizing Mask转换为Auto Layout的约束。这些约束可能会与我们自己添加的约束产生冲突。
所以如果你是使用 Xib/StoryBoard 的话,系统会自动帮你把这个属性设置为 NO
XIB和Storyboard中Use Auto Layout默认是选中的
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
NSLayoutConstraint
Auto Layout 中约束对应的类是NSLayoutConstraint类,一个NSLayoutConstraint代表一条约束。
NSLayoutConstraint的方法
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
view1的某个属性 = view的某个属性的多少倍+某个常量
attribute有上、下、左、右、宽、高等 relatedBy小于等于、等于、大于等于,注意小于等于 或 大于等于 优先会使用 等于 关系,如果 等于 不能满足,才会使用 小于 或 大于。
如果你使用XIB和storyboard,不想拉线去修改约束,可以使用代码修改约束。可以在父view的constraints数组中遍历查找。这是因为view的constraints数组中保存的是子view的约束集合。
修改约束的方法:
setNeedsLayout:告知页面需要更新,但不会立即更新,执行后会立即调用。
layoutlfNeeded:告知页面需要立刻更新。
layoutSubviews:系统重写布局。
updateConstraints:系统更新约束。
-(