10

UIStackView を使用して、IB で単純なコンテナー ビューをセットアップしようとしています。このコンテナーを、配置された唯一のサブビューの中央に配置し、サブビューの固有のコンテンツ サイズを尊重するようにします。

残念ながら、配置と分布の可能なすべての構成で、サブビューは軸に沿って幅を埋めるために引き伸ばされます。

2 番目のビューを追加すると、すべてが期待どおりに動作し、両方のサブビューが固有のコンテンツ サイズ メソッドによって定義されたサイズを維持するため、これは奇妙なエッジ ケースまたはバグのように見えます。

UIStackView がそのように動作する理由を理解したいと思います。

4

1 に答える 1

14

UIStackViewは、優先度 1000 (許容される最大優先度) の制約を作成します。これはUILayoutPriorityRequiredです。可能であれば、これらの制約を満たすために自動レイアウトが必要です。

「高」優先度の制約 (UILayoutPriorityDefaultHigh == 750だと思います) は、スタック ビューに必要な制約と競合するため、自動レイアウトは制約を無視します。

制約の優先度を 1000 に設定すると、自動レイアウトは必要なすべての制約を満たすことができなくなります。エラーがログに記録され、制約の 1 つが破られます。どの制約が破られるかを選択することはできません。

システムを解決するには、3 つの制約の 1 つを破る必要があるだけであり、競合する 3 つの制約のいずれかを破ることができることに注意してください。ただし、相反する 3 つの制約のいずれか 1 つを破っても、ビューの中心にあるシステムから離れることはありません。どの制約自動レイアウトが壊れるかに応じて、ビューは引き伸ばされるか、スタックビューの一端を抱き締める必要があります。また、iOS の将来のバージョンでは自動レイアウトが変更される可能性があるため、別の制約が破られてレイアウトが変更される可能性があります。

スタック ビューを使用してビューを中央に配置しようとしている理由は明確ではありません。UIViewビューが 1 つしかなく、それを中央に配置する場合は、その親をではなくプレーンにUIStackViewし、ビューを親ビューの中央に配置するように制約を設定します。

スタックに複数のサブビューを配置する必要があるためにスタック ビューを使用している場合は、コンテンツ ビューに加えて、2 つの非表示のスペーサー ビュー (軸の両端に 1 つずつ) を追加する必要があります。スペーサー間に等幅または等高の制約を作成します。

于 2015-07-20T19:20:07.583 に答える