这个不但写起来麻烦, 可读性也很差.
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.
这个View的属性默认为true. 当我们要用constraints时需要设置为false.
- 当在storyboard中开始为View设置constraints时, 会自动设置为false.
- 当我们在代码中给view设置约束之前, 需要自己显式地把这个属性设置为false.
- sizeToFit(): 刚好包裹内容的大小.
LinearLayout
.)往Stack View里加需要叠放的元素用的是
addArrangedSubview()
这个方法.与此同时,
addSubview()
方法可以用来加一些别的View.几个属性:
- axis: 主轴方向.
- alignment: 对齐方式.
- distribution: 沿着主轴的分布.
Layout Guide很多时候为了布局的需要我们可能要包裹View或者是添加一下辅助View, 每个View都有自己的layer, 所以为了改进性能, 我们可以使用Layout Guide.
View自带一个layoutMarginsGuide.
还挺方便的. (看了这个视频: https://www.youtube.com/watch?v=4qPcMGiSADA)
Performance & Building Efficient LayoutsiOS12对AutoLayout的性能做了很多改进, 这个WWDC的talk有讲.
关于有效率的布局, 简而言之就是少做无用功.
Constraint Churn
constraint churning
是个典型的性能问题.churn
: 搅动.constraint churn是指更新了constraints, 但实际上view并不需要移动.
这样是给engine发送了额外的信息, 达到一定数量之后, 就会影响性能.
推荐阅读
- springboot项目整合-注册功能模块开发
- 如何煲机,煲耳机有什么方法(耳机最科学的煲机方法)
- 一个实用的 vite + vue3 组件库脚手架工具,提升开发效率
- 高等数学符号的读法 的他符号
- 京东云开发者|关于“React 和 Vue 该用哪个”我真的栓Q
- 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用
- 怎样抽香烟(女人学抽香烟视频)
- 四 【单片机入门】应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用
- 驱动开发:内核层InlineHook挂钩函数
- 20 基于SqlSugar的开发框架循序渐进介绍-- 在基于UniApp+Vue的移动端实现多条件查询的处理