UIStackView詳解

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屬性:

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));
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坞琴,隨后出現(xiàn)的幾起案子突硝,更是在濱河造成了極大的恐慌,老刑警劉巖置济,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件解恰,死亡現(xiàn)場離奇詭異,居然都是意外死亡浙于,警方通過查閱死者的電腦和手機护盈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羞酗,“玉大人腐宋,你說我怎么就攤上這事√垂欤” “怎么了胸竞?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長参萄。 經(jīng)常有香客問我卫枝,道長,這世上最難降的妖魔是什么讹挎? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任校赤,我火速辦了婚禮吆玖,結果婚禮上,老公的妹妹穿的比我還像新娘马篮。我一直安慰自己沾乘,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布浑测。 她就那樣靜靜地躺著翅阵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迁央。 梳的紋絲不亂的頭發(fā)上掷匠,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音漱贱,去河邊找鬼。 笑死夭委,一個胖子當著我的面吹牛幅狮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播株灸,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崇摄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慌烧?” 一聲冷哼從身側響起逐抑,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屹蚊,沒想到半個月后厕氨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡汹粤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年命斧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘱兼。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡国葬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芹壕,到底是詐尸還是另有隱情汇四,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布踢涌,位于F島的核電站通孽,受9級特大地震影響,放射性物質發(fā)生泄漏睁壁。R本人自食惡果不足惜利虫,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一挨厚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糠惫,春花似錦疫剃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至固阁,卻和暖如春壤躲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背备燃。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工碉克, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人并齐。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓况褪,卻偏偏與公主長得像测垛,于是被迫代替她去往敵國和親捏膨。 傳聞我的和親對象是個殘疾皇子食侮,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容