亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以編程方式在UIStackView中添加視圖

以編程方式在UIStackView中添加視圖

蠱毒傳說 2019-11-23 11:22:39
我正在嘗試以編程方式在UIStackView中添加視圖?,F在我的代碼是:UIView *view1 = [[UIView alloc]init];view1.backgroundColor = [UIColor blackColor];[view1 setFrame:CGRectMake(0, 0, 100, 100)];UIView *view2 =  [[UIView alloc]init];view2.backgroundColor = [UIColor greenColor];[view2 setFrame:CGRectMake(0, 100, 100, 100)];[self.stack1 addArrangedSubview:view1];[self.stack1 addArrangedSubview:view2];當我部署應用程序時,只有一個視圖并且它是黑色的。(view1也獲得了view2的參數)
查看完整描述

3 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

堆棧視圖使用內部內容大小,因此使用布局約束來定義視圖的尺寸。


有一種簡單的方法可以快速添加約束(示例):


[view1.heightAnchor constraintEqualToConstant:100].active = true;

完整的代碼:


- (void) setup {


    //View 1

    UIView *view1 = [[UIView alloc] init];

    view1.backgroundColor = [UIColor blueColor];

    [view1.heightAnchor constraintEqualToConstant:100].active = true;

    [view1.widthAnchor constraintEqualToConstant:120].active = true;



    //View 2

    UIView *view2 = [[UIView alloc] init];

    view2.backgroundColor = [UIColor greenColor];

    [view2.heightAnchor constraintEqualToConstant:100].active = true;

    [view2.widthAnchor constraintEqualToConstant:70].active = true;


    //View 3

    UIView *view3 = [[UIView alloc] init];

    view3.backgroundColor = [UIColor magentaColor];

    [view3.heightAnchor constraintEqualToConstant:100].active = true;

    [view3.widthAnchor constraintEqualToConstant:180].active = true;


    //Stack View

    UIStackView *stackView = [[UIStackView alloc] init];


    stackView.axis = UILayoutConstraintAxisVertical;

    stackView.distribution = UIStackViewDistributionEqualSpacing;

    stackView.alignment = UIStackViewAlignmentCenter;

    stackView.spacing = 30;



    [stackView addArrangedSubview:view1];

    [stackView addArrangedSubview:view2];

    [stackView addArrangedSubview:view3];


    stackView.translatesAutoresizingMaskIntoConstraints = false;

    [self.view addSubview:stackView];



    //Layout for Stack View

    [stackView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = true;

    [stackView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = true;

}

注意:這已在iOS 9上進行了測試

http://img1.sycdn.imooc.com//5dd8a61a0001d45e04870801.jpg

查看完整回答
反對 回復 2019-11-23
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

UIStackView在內部使用約束來定位其排列的子視圖。究竟創建什么約束取決于堆棧視圖本身的配置方式。默認情況下,堆棧視圖將創建約束,將其布置在水平線上的子視圖約束,將前導視圖和尾隨視圖固定到其自己的前邊緣和后邊緣。因此,您的代碼將產生如下所示的布局:


|[view1][view2]|

分配給每個子視圖的空間由許多因素決定,包括子視圖的固有內容大小,其抗壓縮性和內容擁抱優先級。默認情況下,UIView實例不定義內部內容大小。這通常是由子類提供的,例如UILabel或UIButton。


由于兩個新UIView實例的內容壓縮阻力和內容包含優先級相同,并且兩個視圖都不提供固有的內容大小,因此布局引擎必須就應該為每個視圖分配什么大小做出最佳猜測。在您的情況下,它將為第一個視圖分配100%的可用空間,而沒有為第二個視圖分配任何空間。


如果修改代碼以使用UILabel實例代替,則將獲得更好的結果:


UILabel *label1 = [UILabel new];

label1.text = @"Label 1";

label1.backgroundColor = [UIColor blueColor];


UILabel *label2 = [UILabel new];

label2.text = @"Label 2";

label2.backgroundColor = [UIColor greenColor];


[self.stack1 addArrangedSubview:label1];

[self.stack1 addArrangedSubview:label2];

請注意,您不必自己明確創建任何約束。這是使用的主要好處UIStackView-它向開發人員隱藏了約束管理的(通常是丑陋的)細節。


查看完整回答
反對 回復 2019-11-23
  • 3 回答
  • 0 關注
  • 927 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號