AutoLayout的前世今生

简介: 今天你用AutoLayout了么?

诞生

AutoLayout是Apple在iOS 6的时候引入的新特性。

AutoLayout使用算法是Cassowary,Cassowary能够有效解析线性等式和线性不等式,用来表示用户界面中的相等关系和不等关系。同时提供一套规则系统,通过约束来描述View之间的关系。

AutoLayout不止有布局算法,还包含了一套布局引擎系统(Layout Engine),用于维护布局在运行时的生命周期。

如何工作

每个View在布局之前,Layout Engine都会先通过计算布局约束,得到View的Size和Position。

Layout Engine会监听约束的变化,当约束发生变化,就会触发约束的重新计算(比如添加、删除View、View的显示隐藏、修改约束条件或者约束优先级)。

在刷新布局时,Layout Engine会从上到下调用layoutSubviews()方法,同时计算出约束的frame,再赋值给View,最后调用superView的setNeedLayout方法来刷新布局。

性能问题

问题出现在View嵌套,并且有同层级View相互关联约束的时候(比如ViewA中,有一个ViewB和ViewC,ViewC有一条约束是ViewC的左侧等于ViewB的右侧偏移10个像素),对性能的影响是呈指数型增长的。

iOS 12之前,每次约束变化时,Layout Engine需要创建一个NSISEngier将约束关系重新计算,所以当约束关系多层嵌套后,计算量会呈指数增长。

iOS 12的Auto Layout更多地利用了Cassowary算法的界面更新策略,提高了约束计算的性能(WWDC 220 Session High Performance Auto Layout),让AutoLayout可以达到和Frame一样的性能。

UIStackView

UIStackView就是Apple在iOS 9时推出的新控件,目的就是仿造前端Flexbox的思路,提高开发效率。再两个相关联的View需要排列时,不再需要添加View之间的约束关系,而可以用Fill,leading,Center来约束他们的排列方式。这是一个推荐的用法。

目录
相关文章
|
8月前
|
Android开发
Android Studio入门之常用布局的讲解以及实战(附源码 超详细必看)(包括线性布局、权重布局、相对布局、网格布局、滚动视图 )
Android Studio入门之常用布局的讲解以及实战(附源码 超详细必看)(包括线性布局、权重布局、相对布局、网格布局、滚动视图 )
666 0
|
8月前
|
Android开发
Android布局——帧布局、表格布局、网格布局
Android布局——帧布局、表格布局、网格布局
|
8月前
|
XML 数据可视化 Java
Android布局——线性布局、相对布局、帧布局、表格布局、网格布局、约束布局
Android布局——线性布局、相对布局、帧布局、表格布局、网格布局、约束布局
251 1
|
Android开发
Android布局
Android布局
84 0
|
编解码 API Android开发
Android开发之AbsoluteLayout绝对布局
Android开发之AbsoluteLayout绝对布局
196 0
Android开发之AbsoluteLayout绝对布局
|
Android开发 数据安全/隐私保护
Android布局优化之ViewStub的使用
背景 最近刚好有看到ViewStub,因此根据个人理解记录下笔记。 ViewStub是Android布局优化的方式之一。 它可以让部分布局延迟加载,从而提高页面渲染速度。
1418 0
|
iOS开发 开发者 程序员
|
iOS开发 Swift 数据可视化
iOS编程(双语版)-视图-Autolayout代码初步
一谈到Autolayout,初学者肯定想到的是IB中使用拖拽啊,pin啊各种鼠标操作来进行添加各种约束。 今天我们要聊得是如何利用代码来添加视图间的约束。 我们来看一个例子: (Objective-C代码) UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(100, 111, 132, 194)]; v1.
967 0