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


这个View的属性默认为true. 当我们要用constraints时需要设置为false.

  • 当在storyboard中开始为View设置constraints时, 会自动设置为false.
  • 当我们在代码中给view设置约束之前, 需要自己显式地把这个属性设置为false.
如果还是用frame布局, 这个属性不用设置成false. 比如在循环里生成很多view的时候, 可能想有一些尺寸和位置用frame设置.
  • sizeToFit(): 刚好包裹内容的大小.
Stack ViewStack View是在Auto Layout的基础上的, 帮助我们做一些水平或者垂直的布局, 不用写内部元素间的constraints. (类似于Android中的LinearLayout.)
往Stack View里加需要叠放的元素用的是addArrangedSubview()这个方法.
与此同时, addSubview()方法可以用来加一些别的View.
几个属性:
  • axis: 主轴方向.
  • alignment: 对齐方式.
  • distribution: 沿着主轴的分布.
Stack View是比较轻量的, 所以官方会建议尽量多使用Stack View, 只在有必要的时候写约束.确实方便很多.
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 Churnconstraint churning是个典型的性能问题.churn: 搅动.
constraint churn是指更新了constraints, 但实际上view并不需要移动.
这样是给engine发送了额外的信息, 达到一定数量之后, 就会影响性能.
需要注意的是:
  • 不要remove all constraints然后又add all. 可以把它们分组, 哪些是固定不变的, 那么addView的时候就加上, 然后activate; 对于需要动态变化的部分可以分两组(比如一个根据内容动态决定是否需要显示图片的例子, 可以有两个数组: imageConstraints和noImageConstraints), 单独activate/deactivate这两组约束.
  • 使用isHidden可以提高效率. 比起add/remove Subview来说.
也是WWDC2018/220里提到的, 如何避免Constraint Churn:
  • Avoid removing all constraints
  • Add static constraints once
  • Only change the constraints that need changing
  • Hide views instead of removing them
Size可以选择性地override一些尺寸, 减少text measure计算的过程:
  • Return size if known without text measurement
  • Use UIView.noIntrinsicMetric and constraints.
System Layout Size Fitting Sizeintrinsic content size是view传给engine的.
而这个system layout size fitting size, 是从engine取出来的.
但是它有想不到的性能消耗. (every time you call the method, an engine is created and discarded.)
DebuggingAuto Layout中由约束引起的错误可能会有:
  • 约束自相矛盾(冲突), 不能满足, 无解. (比如一个宽度即等于100又等于200, ???)
  • 约束不足导致有很多可能的解. (Engine会给出一个解, 但可能不是你想要的.)
关于怎么debug可以看: https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/TypesofErrors.html#//apple_ref/doc/uid/TP40010853-CH17-SW1
大体上是根据Log还有一些可能有帮助的view的属性和方法(供debug用).
这个视频(https://developer.apple.com/videos/play/wwdc2015/219/)的后半段有讲debug.
这里还有一个小工具网站: https://www.wtfautolayout.com/
SummaryAuto Layout是线性代数的应用实例.
有时候搬砖搬久了是不是应该慢下来欣赏一下数学的美.

经验总结扩展阅读