UIStackView(iOS 9以上支持)的实现原理基于AutoLayout所以和其他的View不太相同的是如果我们要好好的使用UIStackView的自动的布局管理.就不能addSubView.而是用addArrangedSubview:.简单的说是arrangedSubviews帮我们自动的管理了布局.而addSubView没有
创建方法
public init(frame: CGRect)
public init(coder: NSCoder)
/// 此方法无法在Swift中重写.
public convenience init(arrangedSubviews views: [UIView]) // Adds views as subviews of the receiver.
属性以及方法
/// 获取UIStackView管理的subview
open var arrangedSubviews: [UIView] { get }
/// 会将view添加到arrangedSubviews列表的末尾.
open func addArrangedSubview(_ view: UIView)
/// 将arrangedSubviews列表中的对应子视图删除,
open func removeArrangedSubview(_ view: UIView)
/// 如果view不在arrangedSubviews列表中.那么就会添加到容器中的这个Index.如果在arrangedSubviews列表中就会更新他的Index
open func insertArrangedSubview(_ view: UIView, at stackIndex: Int)
/// 排列的轴.如果是`.horizontal`就表现为行(类比UITableView).如果是`.vertical`就表现为列
open var axis: NSLayoutConstraint.Axis
/// 具体排列规则.下面有解释
open var distribution: UIStackView.Distribution
/// 对其方式.下面有解释
open var alignment: UIStackView.Alignment
/// Fill状态下允许的最小间距.负值的时候允许子控件重叠
open var spacing: CGFloat
/// 设置某个视图后面视图的间距.@available(iOS 11.0, *)
open func setCustomSpacing(_ spacing: CGFloat, after arrangedSubview: UIView)
/// 获取某个视图后面视图的间距.@available(iOS 11.0, *)
open func customSpacing(after arrangedSubview: UIView) -> CGFloat
/// 垂直情况下是否按照文字控件的基线布局
open var isBaselineRelativeArrangement: Bool
/// 设置为true之后就可以通过UIView的`layoutMargins`属性设置边距.
open var isLayoutMarginsRelativeArrangement: Bool
Distribution
public enum Distribution : Int {
/// 沿着轴线填充满可用的空间.如果空间不够会根据抗压优先级来压缩内部视图.如果空间过多会根据拉伸优先级来拉伸内部视图.如果优先级什么的都相同.会根据Index来调整.
case fill
/// 和上面一个不同的是.沿轴线方向的视图的大小是相同的(比如横向排布的宽度以及纵向排布时的高度)
case fillEqually
/// 按内部内容调整内部大小
case fillProportionally
/// 当排列完之后如果有空隙空间.stackView会使内部控件间的空隙相等.如果空间不够会根据抗压优先级来调整内部视图
case equalSpacing
/// 所有子视图中心距离保持一致
case equalCentering
}
Alignment
public enum Alignment : Int {
/// 全部填充满(axis垂直的左右以及水平的上下)
case fill
/// axis设置为垂直的时候支持的布局.控件靠左.
case leading
/// 对比leading就是中心线靠在中间
case center
/// axis设置为垂直的时候支持的布局.控件靠右
case trailing
/// axis设置为水平的时候支持的布局.类似trailing.不过是底部对其
public static var bottom: UIStackView.Alignment { get }
/// 基线对其.仅仅当asix为水平布局的时候才有效
case lastBaseline // Valid for horizontal axis only
}