[Android开发学iOS系列] Auto Layout( 二 )

这里我们把每一条约束设置了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的工作原理

[Android开发学iOS系列] Auto Layout

文章插图
图来自于: https://developer.apple.com/videos/play/wwdc2018/220
Render loop包含如上三个阶段:
  • update constraints从叶子节点向上.
  • layout从parent节点向下执行.
  • display即最后的绘制阶段.
这三个阶段对应的方法:
[Android开发学iOS系列] Auto Layout

文章插图
Update Constraints它的工作是:
  • 把每个公式(约束)加入计算引擎Engine里.
  • 计算引擎负责解出变量: 最后的frame.
  • 通知View: Superview: setNeedsLayout().
engine这里扮演一个layout cache和tracker. 收到变化时它会重新计算.
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.
优先级优先级的值可以从1到1000, 默认是1000.
  • Required: 1000
  • Default High: 750
  • Default Low: 250
有优先级是因为多个constraints之间可能会有冲突, 那么约束的要求可能不能完全100%满足, 计算引擎会在在不能满足的情况下, 尽量地减少偏差.
约束的优先级就用来表示哪条约束我们更加关心, 更想满足, 优先考虑.
优先级相关的变量
  • content hugging priority: 尺寸比固有内容更大的可能性. 默认250. 值越小表示View更愿意扩张来满足约束了; 值越大表示View希望尽可能地接近固有尺寸.
  • content compression resistance priority: 尺寸比固有内容尺寸更小的阻力程度. 默认750. 值越大表示这个View压缩内容的可能性越小.
Auto Layout的使用细则Properties & Functions有个重要的属性要提一下:
  • translatesAutoresizingMaskIntoConstraints
这个属性是为了兼容Auto Layout出现之前的基于frame布局的legacy layout系统, 帮助View在Auto Layout的世界里, 以legacy layout system的方式运作.
当这个属性为true, 并且设置了frame时, 引擎会自动生成constraints来满足这个frame.

经验总结扩展阅读