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
。開発者から制約管理の (しばしば醜い) 詳細を隠します。