1.动态修改约束的优先级
优先级可根据数字设置范围 0~1000; 系统框架提供
- required(1000)、
- defaultHigh(750)、
- defaultLow(250)、
- fittingSizeLevel(50)
设置约束时,默认的优先值就为required(1000),所以我们在等界面运行起来之后再把它改为其他的值时会报错,例如:1000 改为 250 或 把 250改为 1000
会报如下错误:
Mutating a priority from required to not on an installed constraint (or vice-versa) is not supported. You passed priority 250 and the existing priority was 1000.'
所以我们只能在一开始初始化约束的时候就把优先值设置为1000 以下就可以随便修改约束优先值为1000以下的任何正数值。
2. 触发约束变化包括
- Activating或Deactivating
- 设置constant或priority
- 添加和删除视图
遇到约束变化会重新计算layout,获取新值后会call它的superview.setNeedsLayout()
3.关于使用第三方框架 SnapKit 或 masonry
使用 updateConstraints 方法时一般只是在原有的约束上面修改常常量值, 不可以变更约束的对象, 约束的属性, 约束的优先值
使用 remakeConstraints 时,应注意更本视图相关的约束全部会移除后再重新添加你想要的约束, 包括该视图约束相关的子视图约束也会被清除
当我们想拿到 约束时,只能用一个为外部的变量获取,例如:
var sizeConstraint: Constraint?
var topConstraint: Constraint?
var leftConstraint: Constraint?
greenView.snp.makeConstraints { (maker) in
sizeConstraint = maker.size.equalTo(CGSize(width: 100, height: 100)).constraint
topConstraint = maker.top.equalTo(blueView.snp.bottom).offset(10).priority(750).constraint
leftConstraint = maker.left.equalToSuperview().offset(10).constraint
}
这样子我们就可以修改约束的对象,优先值,或者属性了
4、可以自适应的控件
- Hugging priority让这些控件不要大于某个设定的值,默认优先级为250。例如:三个 UIlaebl 水平布局, 当他们的文本总长度超出了屏幕的宽度时,你想其中的一个 Label 的文案优先展示出来时,可以把 Hugging priority 设的比其他两个优先级高
- Content Compression Resistance就是让控件不要小于某个设定的值,默认优先级为750
网友评论