注:有学到新知识会不断更新
约束的规则
不可以有冲突的约束,考虑改变优先级或者删除
必须要有完整的约束,宽高(固定的宽高还是距离父控件的相对距离大小),相对位置都必须明确。
label这个控件比较特殊,如果添加了约束,不需要添加高度,因为系统会自动包裹,根据文字多少的换行。
兄弟控件之间的约束,应该添加到父控件中,
父子关系之间的约束,应该添加到父控件中
两个没直接关系的控件之间的约束,应该添加到最近的父控件中或者(根)
优先级说明 priority
- 等于1000为强制约束,为强制约束,添加了后这个约束不会被积压或者消失等。
- 大于等于750为不可以压缩内容约束,在750-999之间,谁的priority大,哪个约束就起作用,并且内容会拒绝压缩。
- 小于750,大于等于250效果就是可以挤压内容。
计算公式记录
- leading 左边 Trailling 右边
- 关键的公式,点进去一个约束,然后双击,
- 出现first item(第一个控件),relation(关系,有三种,等于,大于等于,小于等于),second item
- constant(约束的距离大小),priority(优先级),multipller(乘系数)
-
约束 : item1.attribute1 = multiplier × item2.attribute2 + constant
- second item中可以选 左对齐线,中心线,右对齐线
-例如:想要一个控件a保持左边压是父控件中心线的相对约束,可以先随便ctrl拉一个与父控件有联系的约束,然后双击这个约束,在里面将second item中改为center x
- 意思就是 a控件的leading约束等于父控件center x的坐标 * multipller的系数大小+0,此时所以a左边约束会处于父控件的中心
约束之间的关系
- equal:就是等于的意思,乘系数
- less than or equal :当控件小于等于的情况,举个例子,比如label的文字很少,但之前约束的宽度太大,此时如果用小于等于的话,就会当文字很少,约束的宽度就会自动减少到刚好包裹文字。
第三方框架masonry
- 关于如何安装使用CocoaPods(类库管理工具).可以参考http://blog.csdn.net/eqera/article/details/39312125
- 添加了define MAS_SHORTHAND 这个宏,以后都不需要写mas_这个前缀,
- define MAS_SHORTHAND_GLOBALS,自动包装基本数据类型。
- 大多数通过这个类方法 [obj mas_makeConstraints:]在这个block中写入需要的一些约束。
- 大部分的形式如:make.约束的类型.mas_equal(这个约束所对应的对象).offset(约束的值)
- 如果运用乘法或者除法,make.约束类型.equal(这个约束所对应的对象).multipliedBy(比例).offset(约束的值),等于苹果的那个公式:item1.attribute1 = multiplier × item2.attribute2 + constant
错误记录
-
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout)
_viewHierarchyUnpreparedForConstraint:] to debug.- 这个错误有两种情况,第一个最多的是 不按约束规则去添加,比如 父子关系之间的约束,应该添加到父控件中,但是却加到子控件身上去了这种情况会报错,
- 第二种是添加约束里面的控件还没加入到指定的父控件中。
-
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.- 这个问题在于没有添加这句代码
blueView.translatesAutoresizingMaskIntoConstraints = NO; - 或者约束与宽度超出了屏幕,不合理的约束
- 这个问题在于没有添加这句代码