3 回答

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上進行了測試

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-它向開發人員隱藏了約束管理的(通常是丑陋的)細節。
- 3 回答
- 0 關注
- 927 瀏覽
添加回答
舉報