iOS开发

iOS - AutoLayout

2019-04-18  本文已影响0人  冰风v落叶

1. AutoLayout的核心

苹果公司推出的AutoLayout,是一个基于约束,动态计算视图大小和位置的库,以布局引擎系统Layout Engine为核心,采用了 Cassowary布局算法,在简化布局思路的同时,还保证了布局的高效性。

布局算法Cassowary能够有效解析线性等式系统和线性不等式系统,用来表示用户界面中那些相等关系和不等关系,通过设定约束来表示一个视图相对于另一个视图的位置。

Cassowary简化了布局思路,在运行时动态的计算视图位置。布局思路简化了,也使界面相关代码更容易维护。

布局引擎系统Layout Engine则统一管理了布局的创建、更新、销毁,将视图的约束、优先级、固定大小通过计算转换成最终的大小和位置。

在Layout Engine中,每当约束发生变化,会重新计算布局,获取到布局后调用superview.setNeedLayout(),然后触发Deffered Layout Pass做容错处理,然后Layout Engine会从上到下调用layoutSubviews()来确定各子视图的位置(通过Cassowary算法计算),算出来后将子视图的frame从Layout Engine里拷贝出来,然后进行绘制、渲染,得到我们眼中看到的UI效果。

2. AutoLayout的性能

在iOS12之前,AutoLayout在处理多层级嵌套时,开销呈指数级跃增,但是从iOS12开始,苹果补齐了这一漏洞,所以在iOS12及以后,我们就开始放心的使用AutoLayout,而不用担心性能问题。

更多关于AutoLayout的性能问题及解决方法,请查看WWDC2018-202

AutoLayout在iOS12中的表现.png

3. AutoLayout常见的问题

(1)几个更新方法的区别
(2)系统调用layoutSubviews的时机
(3)Intrinsic content size 固有内容大小
class TestView: UIView {
    override var intrinsicContentSize: CGSize {
        return CGSize(width: 300, height: 800)
    }
}
(4)手写autoLayout,写在哪里最好
(5)SizeClass适配

关于SizeClass,请看我的另一篇简书适配iPad和iPhone及其横竖屏

(6)UIStackView

对一些特定布局时,使用UIStackView很节省时间,iOS9.0之后可用


StackView.png
(7)UITableView的高度计算
  let tableViewCell = Bundle.main.loadNibNamed("tableViewCell", owner: self, options: nil)?.last
  //先给给tablViewCell中的控件赋值,然后在计算高度
  if let tableViewCell = tableViewCell as? UITableViewCell{
       let cellSize = tableViewCell.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
  }
  //然后在缓存高度到Model中
tableView.estimatedRowHeight = 300
tableView.rowHeight = UITableView.automaticDimension
上一篇 下一篇

猜你喜欢

热点阅读