UIStackView
内部で制約を使用して、配置されたサブビューを配置します。作成される制約は、スタックビュー自体の構成方法によって異なります。デフォルトでは、スタックビューは、配置されたサブビューを水平線に配置する制約を作成し、リーディングビューとトレーリングビューをそれぞれのリーディングエッジとトレーリングエッジに固定します。したがって、コードは次のようなレイアウトを生成します。
|[view1][view2]|
各サブビューに割り当てられるスペースは、サブビューの固有のコンテンツサイズ、圧縮耐性、コンテンツハグの優先順位など、いくつかの要因によって決定されます。デフォルトでは、UIView
インスタンスは固有のコンテンツサイズを定義しません。これは、UILabel
またはなどのサブクラスによって一般的に提供されるものですUIButton
。
コンテンツ圧縮耐性とコンテンツハグの優先順位が2つあるため、 UIView
インスタンス同じであり、どちらのビューも固有のコンテンツサイズを提供しないため、レイアウトエンジンは、各ビューに割り当てられるサイズを最適に推測する必要があります。あなたの場合、それは最初のビューを利用可能なスペースの100%に割り当て、2番目のビューには何も割り当てていません。
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
。制約管理の(多くの場合は醜い)詳細が開発者から見えなくなります。