UIStackView

在iOS9中苹果在UIKit框架中引入了一个新的视图类UIStackView。

UIStackView 是一个虚拟容器,它的layer不被绘制,设置背景、边框、阴影这些外观是无效的。

UIStackView

UIStackView 类提供了一个高效的接口用于平铺一行或一列的视图组合,stackView提供了高效的单行单列自动布局的手段,一般情况下,我们不需要对stackView.subviews做任何约束,只需要通过对stackView的axis, distribution, alignment, spacing属性进行修改;

  • axis(轴向) 属性决定了 stack 的朝向,只有垂直或水平;
  • spacing(空隙) 属性决定了其管理的视图间的最小间隙;
  • distribution(分布) 属性决定了其管理的视图在沿着其轴向上的布局;
Fill : 铺满
Fill Equal : 等宽铺满
Fill Proportionally : 等比例铺满
Equal Spacing :等距离放置
Equal Centering :各个试图的中心距离保持一致,不够放置则压缩后面的试图距离;
  • alignment(对齐) 属性决定了其管理的视图在垂直于其轴向上的布局;
Fill : 垂直方向上铺满
Top : 沿顶端对齐
Center : 沿中心线对其
Bottom : 沿底部对齐
First Baseline : 按照第一个子视图的文字的第一行对齐,同时保证高度最大的子视图底部对齐(只在axis为水平方向有效)
Last Baseline : 按照最后一个子视图的文字的最后一行对齐,同时保证高度最大的子视图顶部对齐(只在axis为水平方向有效)

如图所示:


Intrinsic Content Size

Intrinsic Content Size也就是控件的内置大小。比如UILabel,UIButton等控件,他们都有自己的内置大小。

  • 控件的内置大小往往是由控件本身的内容所决定的,比如一个UILabel的文字很长,那么该UILabel的内置大小自然会很长。
  • 控件的内置大小可以通过UIView的intrinsicContentSize属性来获取,也可以通过invalidateIntrinsicContentSize方法来在下次UI规划事件中重新计算intrinsicContentSize。
  • instrinsicContentSize的内容为空,那么它的instrinsicContentSize默认值是{UIViewNoIntrinsicMetric,UIViewNoIntrinsicMetric},而UIViewNoIntrinsicMetric = -1;即为{-1,-1}。

哪些View拥有Intrinsic Content Size?

UIView、Slider、Label、Button、Switch、Text Field、Text View、Image View

Content Hugging和Content Compression Resistance约束的优先级

Content Hugging即为抗拉伸阻力,而Content Compression Resistance即为抗压缩阻力。

  • Content Hugging : 如果内容的抗拉伸阻力的优先级越高,那么视图越不容易被拉伸
  • Content Compression Resistance : 如果内容的抗压缩阻力的优先级越高,那么视图越不容易被压缩

在处理含有Intrinsic Content Size属性控件的时候,注意Content Hugging和Content Compression Resistance约束的优先级,否则会造成拉伸错误。

动态添加或者隐藏视图元素的需求

如果手动修改frame,或者autolayout修改约束,都不是最好的选择。

使用UIStackView,对需要隐藏的控件进行hidden,可以自动重新布局排列。

参考

  • https://www.jianshu.com/p/6f2cc8b743b6
  • https://www.jianshu.com/p/119cb3fc49dd