公司的项目布局很多用的是NSLayoutConstraint,为了更好的开发,深入研究了下iOS官方开发文档关于它的介绍,借此改善了项目中某些警告,同时总结了下几个重点地方。
一、冲突解决:
iOS有两大自动布局利器:Autoresizing 和 Autolayout,而NSLayoutConstraint就基于Autolayout的类。
1.在使用NSLayoutConstraint时,第一件需要做的事是需要将视图的 setTranslatesAutoresizingMaskIntoConstraints 属性设置为 NO,原因是为了防止运行时,系统自动地将 Autoresizing Mask 转换为 Auto Layout 的约束而导致与自己添加的约束冲突。
2.注意的是如果同时对某一地方添加两个类型相同只是数值不同的约束,一定要做判断,可以移除某一个或者设置执行优先级priority(数值越大越先执行,这也正是项目中某些地方报警告提示冲突的原因)
二、约束算法
感觉NSLayoutConstraint的约束可读性不强,如果只看头文件无法快速上手。因此在官方文档上还专门给出了算法公式以及很多说明:
PIC5.png
具体来说就是这样的:
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem: 当前需要约束的View1
attribute: 约束类型基于View1(高度,宽度,方向等)
relatedBy: 附属关系(小于等于,等于,大于等于)
toItem: 当前需要参照约束的View2
attribute: 约束类型基于View2(高度,宽度,方向等)
multiplier: 一个与view2约束类型相乘的乘数
constant:与view2属性相加的浮点数
比如设置view1是self.view高度的1/2:
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:View1
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeHeight
multiplier:0.5
constant:0];
比如设置view1距离底部20单位
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:view1
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:1
constant:-20]];
三、总结
NSLayoutConstraint的优点:
1.非常灵活,使用相对布局,对于不同尺寸的屏幕可以用相同的一套来快速布局
2.耦合性低,修改只需考虑相对View
NSLayoutConstraint的缺点:
1.可读性不强,如果用于复杂的约束需要通过公式计算,越复杂的布局可读性越低,不易维护
2.比较冗杂,用完成几个控件的约束要写很多代码
网友评论