1.约束是一系列视图布局的规则,约束规则描述的是关系,不一定是视图在某个方向上的属性,每条约束都有优先级,除了优先级各条约束之间并没有其他自然顺序,有些约束规则只需大致满足即可,约束之间可以有循环,在动画块中调用layoutIfNeeded来表现变化过程,约束规则内可以引用同一体系的其他视图,约束规则不应该跨越约束系统,自动布局与transform配合的不够好,与运动效果motion effect可以一起工作,约束运行期可能出错,格式错误的约束可能崩溃,每条规则必须至少引用一个视图,避免无效的属性搭配
2.谓词带有比较关系的运算符,通过@来设置优先级,移除不归该视图所拥有的约束是没有效果的,添加约束addConstraint/s,requiresConstraintBasedLayout的类方法,可以知道这视图类是否必须放在基于约束的布局系统内,以编程的方式添加约束,需要把子视图的translatesAutoresizingMaskIntoConstraints属性关闭
3.处理约束规则的流程:布局阶段,渲染阶段,约束阶段;layoutSubViews方法在布局阶段修改各个子视图的几何特征,当ios认定某视图布局无效时会调用,手动更新,setNeedsLayout比较温和,会把很多请求合并起来,layoutSubviews再调用后立刻就会执行;渲染阶段实现drawRect:完全控制视图UI的绘制,手动触发方法,setNeedsDisplay 及setNeedsDisplayInRect;约束阶段类似,setNeedsUpdateConstraints及updateConstraintsIfNeeded手动更新,重写updateConstranis方法务必调用[super updateConstraints];先约束再布局最后渲染,请勿在布局阶段修改约束,否则陷入无限循环
4.UIView会把约束规则当成NSLayoutConstraint对象来保存或移除,即使两条规则含义相同,只要内存地址不同,就是不相等的,同过七个属性比较规则是否相等,不比较优先级
5.用动画表现约束变更过程[UIView animateWithDuration:0.3 animations:^{[self.view layoutIfNeeded]}];
6.禁用autoresizing会涉及自动调整的功能的掩码自行转换成约束规则,令视图出现在上级视图范围内constrainWithinSuperviewBounds
7.原则:创建约束规则的时候,如果规则所涉及的某个视图是另一个视图的上级视图,那么就把规则添加到这个上级视图里;
8.updateViewControllerConsraints方法能够依照当前屏幕方向来刷新约束规则,设置新的约束,在willAnimateRotationToInterfaceOrientation:duration里调用此方法,得到平滑地融合起来
原文:http://www.cnblogs.com/shaohui/p/5334230.html