UIStackView簡(jiǎn)單理解和使用

一级遭、UIStackView簡(jiǎn)介

UIStackView是iOS9中新增的API,類似于Android中的線性布局。UIStackView提供了一個(gè)高效的接口用于平鋪一行或一列的視圖組合。對(duì)于嵌入到StackView的視圖餐抢,你不用再添加自動(dòng)布局的約束了。Stack View管理這些子視圖的布局玲献,并幫你自動(dòng)布局約束廓啊。也就是說(shuō),這些子視圖能夠適應(yīng)不同的屏幕尺寸乾胶。此外抖剿,你可以嵌入一個(gè)stack View到另一個(gè)stack view中來(lái)創(chuàng)建更為復(fù)雜的用戶界面朽寞。不要誤解我的意思,這并不意味著你就不需要處理自動(dòng)布局了斩郎。你仍舊要定義一些布局約束來(lái)約束stack view脑融。它只是幫你節(jié)約了為每個(gè)UI元素創(chuàng)建約束的時(shí)間,同時(shí)它更容易的從布局中添加/刪除一個(gè)視圖缩宜。

     UIStackView *stackView = [[UIStackView alloc] init];
    [self.view addSubview:stackView];
    stackView.frame = CGRectMake(100, 100, 200, 50);
    stackView.backgroundColor = [UIColor redColor];
    UILabel *lable = [[UILabel alloc] init];
    lable.text = @“測(cè)試”;
    lable.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
    [stackView addArrangedSubview:lable];
  • 1肘迎、 UIStackView是UIView的子類,但backgroundColor 設(shè)置是無(wú)效的
  • 2锻煌、UIStackView是通過(guò)它的 arrangedSubviews屬性列表來(lái)管理view的妓布, 而通過(guò)- (void)addArrangedSubview:(UIView *)view就可以將view添加到arrangedSubviews中
  • 3、 stack view 用自動(dòng)布局的方式來(lái)確定其子view的大小和位置宋梧。
  • 4匣沼、在水平方向上,第一個(gè)view的左邊緣和stack view的左邊緣是對(duì)齊的捂龄,最后一個(gè)view的右邊緣和stack view的右邊
    邊緣是對(duì)齊的释涛,


    截屏2020-08-20 上午10.22.14.png
截屏2020-08-20 上午10.23.50.png

如果你再去這樣給子view設(shè)置左邊的約束,自然是無(wú)效的

   [lable mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(stackView).offset(20);
    }];

控制臺(tái)也會(huì)打印這樣約束沖突的錯(cuò)誤
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
因此需要注意的是倦沧,UIStackview內(nèi)部也是通過(guò)約束來(lái)實(shí)現(xiàn)的唇撬,因此,必須提供足夠的且正確的約束才能使用好它刀脏。

二局荚、axis

@property(nonatomic) UILayoutConstraintAxis axis;
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
    UILayoutConstraintAxisHorizontal = 0,
    UILayoutConstraintAxisVertical = 1
};

管理子view的布局方向,屬性值決定了子view的排布是按水平方向依次排布愈污,還是沿著豎直方向依次排布耀态。默認(rèn)是UILayoutConstraintAxisHorizontal

 stackView.axis  =  UILayoutConstraintAxisHorizontal;
截屏2020-08-20 下午1.50.54.png
  stackView.axis  =  UILayoutConstraintAxisVertical;
截屏2020-08-20 下午1.51.38.png

三、distribution

property(nonatomic) UIStackViewDistribution distribution;
typedef NS_ENUM(NSInteger, UIStackViewDistribution) {
    UIStackViewDistributionFill = 0,
    UIStackViewDistributionFillEqually,
    UIStackViewDistributionFillProportionally,
    UIStackViewDistributionEqualSpacing,
    UIStackViewDistributionEqualCentering,
} ;

決定著在軸線方向上是怎么樣布局的暂雹,默認(rèn)值是UIStackViewDistributionFill

  • 1首装、UIStackViewDistributionFill:子view填滿主軸方向StackView空間。
  • 2杭跪、 UIStackViewDistributionFillEqually:使所有子視圖在軸方向上等寬或等高
  • 3仙逻、UIStackViewDistributionFillProportionally:根據(jù)原先子視圖的比例來(lái)拉伸或壓縮子視圖的寬或高
  • 4、UIStackViewDistributionEqualSpacing:所有子視圖中間的間隔保持一致
  • 5涧尿、UIStackViewDistributionEqualCentering: 所有子視圖的中心之間的距離保持一致

3.1系奉、UIStackViewDistributionFill

1、stackView 大小約束確定

    UIStackView *stackView = [[UIStackView alloc] init];
    [self.view addSubview:stackView];
    stackView.axis  =  UILayoutConstraintAxisHorizontal;
    stackView.distribution = UIStackViewDistributionFill;
    stackView.frame = CGRectMake(30, 100, 300, 300);
    for (int i=0; i<4; i++) {
        UIView *view  =[[UIView alloc]init];
        [stackView addArrangedSubview:view];
        view.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
           if (i<3) {
             [view mas_makeConstraints:^(MASConstraintMaker *make) {
                    make.width.equalTo(@90);
            }];
        }
    }
   
  • stackView大小約束確定:通過(guò)指定子元素的大小約束或者固有大小來(lái)布局子元素姑廉,當(dāng)所有子元素超出stackView或者沒(méi)有充滿stackView缺亮,會(huì)自動(dòng)根據(jù)約束的優(yōu)先級(jí)對(duì)某一個(gè)子view拉伸或者壓縮;當(dāng)約束優(yōu)先級(jí)不能確定時(shí)桥言,就按照排布的順序萌踱,對(duì)最后一個(gè)view拉伸或者壓縮;

2葵礼、stackView 大小不確定


    UIStackView *stackView = [[UIStackView alloc] init];
    [self.view addSubview:stackView];
    stackView.axis  =  UILayoutConstraintAxisHorizontal;
    stackView.distribution = UIStackViewDistributionFill;
    [stackView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(10);
    }];
    for (int i=0; i<4; i++) {
        UIView *view  =[[UIView alloc]init];
        [stackView addArrangedSubview:view];
        view.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
             [view mas_makeConstraints:^(MASConstraintMaker *make) {
                 make.width.height.equalTo(@90);
          }];

stackView 大小不確定:所有的子元素指定大小約束,會(huì)自動(dòng)根據(jù)子元素調(diào)整stackView的大小并鸵。

3.2鸳粉、 UIStackViewDistributionFillEqually

1、stackView 大小約束確定

   UIStackView *stackView = [[UIStackView alloc] init];
    [self.view addSubview:stackView];
    stackView.axis  =  UILayoutConstraintAxisHorizontal;
    stackView.distribution = UIStackViewDistributionFillEqually;
    [stackView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(10);
        make.height.equalTo(@200);
        make.width.equalTo(@300);
    }];
    for (int i=0; i<4; i++) {
        UIView *view  =[[UIView alloc]init];
        [stackView addArrangedSubview:view];
        view.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
    }

2园担、stackView 大小約束不確定

    UIStackView *stackView = [[UIStackView alloc] init];
    [self.view addSubview:stackView];
    stackView.axis  =  UILayoutConstraintAxisHorizontal;
    stackView.distribution = UIStackViewDistributionFillEqually;
    [stackView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(10);
    }];
    for (int i=0; i<4; i++) {
        UIView *view  =[[UIView alloc]init];
        [stackView addArrangedSubview:view];
        view.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
        [view mas_makeConstraints:^(MASConstraintMaker *make) {
            make.width.equalTo(@60);
            make.height.equalTo(@300);
        }];
    }

3届谈、 UIStackViewDistributionEqualSpacing

1、stackView 大小約束確定

    UIStackView *stackView = [[UIStackView alloc] init];
    [self.view addSubview:stackView];
    stackView.axis  =  UILayoutConstraintAxisHorizontal;
    stackView.distribution = UIStackViewDistributionEqualSpacing;
    [stackView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(10);
        make.width.equalTo(@300);
        make.height.equalTo(@100);
    }];
    for (int i=0; i<4; i++) {
        UIView *view  =[[UIView alloc]init];
        [stackView addArrangedSubview:view];
        view.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
        [view mas_makeConstraints:^(MASConstraintMaker *make) {
            make.width.equalTo(@30);
        }];
    }

2粉铐、stackView 大小約束不確定

   UIStackView *stackView = [[UIStackView alloc] init];
    [self.view addSubview:stackView];
    stackView.spacing = 20;
    stackView.axis  =  UILayoutConstraintAxisHorizontal;
    stackView.distribution = UIStackViewDistributionEqualSpacing;
    [stackView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(10);
        make.height.equalTo(@100);
    }];
    for (int i=0; i<4; i++) {
        UIView *view  =[[UIView alloc]init];
        [stackView addArrangedSubview:view];
        view.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
        [view mas_makeConstraints:^(MASConstraintMaker *make) {
            make.width.equalTo(@30);
        }];
    }
   

4疼约、 spacing

  • 1、Fill distributions( UIStackViewDistributionFill 蝙泼、 UIStackViewDistributionFillEqually程剥、 UIStackViewDistributionFillProportionally): spacing確定了子view的嚴(yán)格間距
  • 2、other(UIStackViewDistributionEqualSpacing汤踏、 UIStackViewDistributionEqualCentering):spacing作為了 最小間距织鲸,可能子view之間的間距會(huì)更大一些。

四溪胶、alignment

@property(nonatomic) UIStackViewAlignment alignment;
typedef NS_ENUM(NSInteger, UIStackViewAlignment) {
    UIStackViewAlignmentFill,子視圖填充StackView
    UIStackViewAlignmentLeading,子視圖左對(duì)齊(axis為垂直方向而言)
    UIStackViewAlignmentTop = UIStackViewAlignmentLeading,子視圖頂部對(duì)齊(axis為水平方向而言)
    UIStackViewAlignmentFirstBaseline, 按照第一個(gè)子視圖的文字的第一行對(duì)齊搂擦,同時(shí)保證高度最大的子視圖底部對(duì)齊(只在axis為水平方向有效)
  
    UIStackViewAlignmentCenter,子視圖居中對(duì)齊
   
    UIStackViewAlignmentTrailing,子視圖右對(duì)齊(axis為垂直方向而言)

    UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing,子視圖底部對(duì)齊(axis為水平方向而言)
    UIStackViewAlignmentLastBaseline, 按照最后一個(gè)子視圖的文字的最后一行對(duì)齊,同時(shí)保證高度最大的子視圖頂部對(duì)齊(只在axis為水平方向有效)
} ;

決定了垂直軸方向的布局


截屏2020-08-20 下午5.03.34.png
    UIStackView *containerView = [[UIStackView alloc] init];
    containerView.axis = UILayoutConstraintAxisHorizontal;
    containerView.alignment =   UIStackViewAlignmentTop ;
    containerView.spacing = 10;
    NSMutableString *testString =[[NSMutableString alloc]init];
    for (int i=0; i<5; i++) {
        UILabel *lable = [[UILabel alloc] init];
        lable.backgroundColor = [UIColor colorWithRed:random()%256/255.0 green:random()%256/255.0 blue:random()%256/255.0 alpha:1];
        [containerView addArrangedSubview:lable];
        NSString *str = [NSString stringWithFormat:@"%d",I];
        [testString appendString:str];
        lable.text = testString;
    }
    [self.view addSubview:containerView];
    [containerView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.offset(100);
        make.centerX.equalTo(self.view);
        make.height.equalTo(@100);
    }];
截屏2020-08-20 下午5.24.44.png

五哗脖、實(shí)戰(zhàn)應(yīng)用

一瀑踢、封裝一個(gè)圖文位置上、下才避、左橱夭、右調(diào)整的按鈕

http://www.reibang.com/p/72882fded55a

二、UIScrollView+UIStackView

http://www.reibang.com/p/fea8f927beb6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桑逝,一起剝皮案震驚了整個(gè)濱河市棘劣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楞遏,老刑警劉巖茬暇,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寡喝,居然都是意外死亡糙俗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)预鬓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巧骚,“玉大人,你說(shuō)我怎么就攤上這事⊥欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蟋定,是天一觀的道長(zhǎng)粉臊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)驶兜,這世上最難降的妖魔是什么扼仲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抄淑,結(jié)果婚禮上屠凶,老公的妹妹穿的比我還像新娘。我一直安慰自己肆资,他們只是感情好矗愧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著郑原,像睡著了一般唉韭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犯犁,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天属愤,我揣著相機(jī)與錄音,去河邊找鬼酸役。 笑死住诸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涣澡。 我是一名探鬼主播贱呐,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼暑塑!你這毒婦竟也來(lái)了吼句?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤事格,失蹤者是張志新(化名)和其女友劉穎惕艳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體驹愚,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡远搪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逢捺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谁鳍。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倘潜,到底是詐尸還是另有隱情绷柒,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布涮因,位于F島的核電站废睦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏养泡。R本人自食惡果不足惜嗜湃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澜掩。 院中可真熱鬧购披,春花似錦、人聲如沸肩榕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)株汉。三九已至橘荠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郎逃,已是汗流浹背哥童。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褒翰,地道東北人贮懈。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像优训,于是被迫代替她去往敵國(guó)和親朵你。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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