这里我们把每一条约束设置了isActive = true
.
也可以直接放在一个数组里一起activate, 会有性能优势:
NSLayoutConstraint.activate([myView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),myView.trailingAnchor.constraint(equalTo: margins.trailingAnchor),myView.heightAnchor.constraint(equalTo: myView.widthAnchor, multiplier: 2.0)])
使用NSLayoutConstraint使用NSLayoutConstraint
写起来比较啰嗦, 必须给每个参数都指定值:
NSLayoutConstraint(item: myView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leadingMargin, multiplier: 1.0, constant: 0.0).isActive = trueNSLayoutConstraint(item: myView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailingMargin, multiplier: 1.0, constant: 0.0).isActive = trueNSLayoutConstraint(item: myView, attribute: .height, relatedBy: .equal, toItem: myView, attribute:.width, multiplier: 2.0, constant:0.0).isActive = true
这个不但写起来麻烦, 可读性也很差.
Visual Format Language (VFL)let views = ["myView" : myView]let formatString = "|-[myView]-|"let constraints = NSLayoutConstraint.constraints(withVisualFormat: formatString, options: .alignAllTop, metrics: nil, views: views)NSLayoutConstraint.activate(constraints)
用一些键盘符号来表达这个布局的. (like a way of drawing the layout you want with a series of keyboard symbols)
管道符号代表parent view的边边.
Auto Layout的工作原理
文章插图
图来自于: https://developer.apple.com/videos/play/wwdc2018/220
Render loop包含如上三个阶段:
- update constraints从叶子节点向上.
- layout从parent节点向下执行.
- display即最后的绘制阶段.
文章插图
Update Constraints它的工作是:
- 把每个公式(约束)加入计算引擎Engine里.
- 计算引擎负责解出变量: 最后的frame.
- 通知View: Superview: setNeedsLayout().
Layout从engine得到信息后, Subview setBounds(), subview setCenter().
尺寸和优先级了解了Auto Layout的原理之后, 看尺寸和优先级的部分就很好理解.
Intrinsic content size有一些View有固有内容尺寸, 对于AutoLayout来说, 会默认使用intrinsic content size, 这样开发者就不用非得提供尺寸信息.
默认使用: intrinsic content size. 固有内容尺寸.
- UIImageView: image size.
- UILabel: text size.
- Required: 1000
- Default High: 750
- Default Low: 250
约束的优先级就用来表示哪条约束我们更加关心, 更想满足, 优先考虑.
优先级相关的变量
- content hugging priority: 尺寸比固有内容更大的可能性. 默认250. 值越小表示View更愿意扩张来满足约束了; 值越大表示View希望尽可能地接近固有尺寸.
- content compression resistance priority: 尺寸比固有内容尺寸更小的阻力程度. 默认750. 值越大表示这个View压缩内容的可能性越小.
translatesAutoresizingMaskIntoConstraints
当这个属性为true, 并且设置了frame时, 引擎会自动生成constraints来满足这个frame.
经验总结扩展阅读
- 2023年9月17日开学典礼黄道吉日 2023年9月17日开学典礼好吗
- 2023年农历八月初三宜开学吗 2023年9月17日开学行吗
- 2023年9月17日适合拜师学艺吗 2023年农历八月初三宜拜师学艺吗
- 2023年9月17日上学吉日一览表 2023年9月17日是上学吉日吗
- 2023年1月29日拜师学艺黄道吉日 2023年农历正月初八宜拜师学艺吗
- 2023年1月29日上学黄道吉日 2023年1月29日上学好不好
- 2023年1月29日是开学典礼吉日吗 2023年1月29日适合开学典礼吗
- 2023年1月29日适合开学吗 2023年1月29日开学好吗
- 2023年1月29日入学行吗 2023年农历正月初八宜入学吗
- 我是学生能送我吗是什么梗