1. 概念
蘋果在iOS9中
UIKit
框架引入一個新的視圖類UIStackView
:
UIStackView
視圖 管理著所有在它的arrangedSubviews
屬性 中的 視圖的布局诀姚。- 這些視圖根據(jù)它們在
arrangedSubviews
數(shù)組 中的順序沿著UIStackView
視圖 的 軸向排列藻烤。簡而言之惜互,
UIStackView
是一個ContainerView
,可以沿 橫向或縱向 按照一定的規(guī)則 布局內(nèi)部的子View
。
2. 詳解
(1) 初始化
- (instancetype)init;
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
// 初始化方法迅腔,通過子視圖數(shù)組初始化StackView
- (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views;
// 被排列子視圖數(shù)組
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *arrangedSubviews;
(2) 屬性
蘋果開發(fā)文檔給了一張圖展示UIStackView
屬性:
1> 屬性axis
(軸向)
設置UIStackView
布局的方向:
@property(nonatomic) UILayoutConstraintAxis axis;
// 枚舉
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
// 水平布局
UILayoutConstraintAxisHorizontal = 0,
// 垂直布局
UILayoutConstraintAxisVertical = 1
};
2> 屬性distribution
(分布)
設置軸方向上 子視圖的分布比例:
(如果axis
是水平方向,設置子視圖的寬度;如果axis
是垂直方向伍伤,設置子視圖的高度)
@property(nonatomic) UIStackViewDistribution distribution;
// 枚舉
typedef NS_ENUM(NSInteger, UIStackViewDistribution) {
// 填滿
UIStackViewDistributionFill = 0,
// 子視圖等比例填充
UIStackViewDistributionFillEqually,
// 原比例填充
UIStackViewDistributionFillProportionally,
// 以等距的空白填充子視圖之間的空隙,如果填充超出StackView遣钳,則按照子視圖順序進行壓縮
UIStackViewDistributionEqualSpacing,
// 依據(jù)子視圖的中心點來平均分配布局扰魂,保持最小間距空白等距填充。超出區(qū)域則按照順序壓縮子視圖
UIStackViewDistributionEqualCentering,
} API_AVAILABLE(ios(9.0));
3> 屬性alignment
(對齊)
設置非軸方向上 子視圖的對齊方式:
@property(nonatomic) UIStackViewAlignment alignment;
// 枚舉
typedef NS_ENUM(NSInteger, UIStackViewAlignment) {
// 填滿,水平頭尾對齊劝评,垂直上下對齊
UIStackViewAlignmentFill,
// 水平頭對齊
UIStackViewAlignmentLeading,
// 垂直上對齊
UIStackViewAlignmentTop = UIStackViewAlignmentLeading,
// 僅用于水平軸向姐直,子視圖與第一個控件基準線對齊
UIStackViewAlignmentFirstBaseline,
// 居中對齊
UIStackViewAlignmentCenter,
// 垂直尾部對齊
UIStackViewAlignmentTrailing,
// 水平底部對齊
UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing,
// 僅用于水平軸向,子視圖與最后一個控件基準線對齊
UIStackViewAlignmentLastBaseline,
} API_AVAILABLE(ios(9.0));
4> 屬性spacing
(間隔)
設置軸方向上 子視圖的間隔:
@property(nonatomic) CGFloat spacing;
5> 其他屬性
// 布局時是否參照基準線蒋畜,默認是NO
@property(nonatomic,getter=isBaselineRelativeArrangement) BOOL baselineRelativeArrangement;
// 設置布局時是否以控件的LayoutMargins為標準声畏,默認為NO,是以控件的bounds為標準
@property(nonatomic,getter=isLayoutMarginsRelativeArrangement) BOOL layoutMarginsRelativeArrangement;
(3) 方法
// 添加子視圖
- (void)addArrangedSubview:(UIView *)view;
// 移除子視圖
- (void)removeArrangedSubview:(UIView *)view;
// 插入子視圖
- (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex;
注意:addArrangedSubview和insertArrangedSubview姻成,會把子視圖添加到arrangedSubviews數(shù)組的同時也添加到StackView上插龄,但是removeArrangedSubview,只會把子視圖從arrangedSubviews數(shù)組中移除科展,不會從subviews中移除均牢,如果需要可調(diào)用removeFromSuperview。
當視圖被加入才睹、移出或插入 arrangedSubviews 數(shù)組時徘跪,或當一個被管理的子視圖的 hidden 屬性改變時,stack 視圖都會自動更新它的布局琅攘。
3. iOS 11新增
(1) 新增屬性
iOS 11新增兩個屬性:系統(tǒng)間隙垮庐、默認間隙
// 默認間隙
static const CGFloat UIStackViewSpacingUseDefault API_AVAILABLE(ios(11.0),tvos(11.0)) = FLT_MAX;
// 系統(tǒng)間隙
static const CGFloat UIStackViewSpacingUseSystem API_AVAILABLE(ios(11.0),tvos(11.0)) = FLT_MIN;
(2) 新增方法
iOS 11新增兩個方法:
// 設置間隙
- (void)setCustomSpacing:(CGFloat)spacing afterView:(UIView *)arrangedSubview API_AVAILABLE(ios(11.0),tvos(11.0));
// 獲得間隙值
- (CGFloat)customSpacingAfterView:(UIView *)arrangedSubview API_AVAILABLE(ios(11.0),tvos(11.0));