web-dev-qa-db-ja.com

水平UIStackViewをどのように正しく配置しますか?

私はまだこれに対する答えを見つけていませんし、それが可能かどうかはわかりませんが、水平_UIStackViewを右揃えしようとしていますので、サブビューが隠れている場合は右側に移動します左ではありません。プログラムで(Swiftで)またはInterface Builderを使用して

UIStackViewsは、ユーザーのテキスト方向に従って整列します。つまり、英語およびその他のローマ字スクリプト言語では左揃え、ヘブライ語などの言語では右揃えです。

私の意見では、レイアウト上の理由でこれを変更することはテキスト方向APIの誤用であり、ちょっとしたハックかもしれませんが、それを念頭に置いてください:

セマンティックドロップダウンを使用して、インターフェイスビルダーで特定のビューの方向を変更できます。セマンティックドロップダウンには、「左から右に強制」および「右から左に強制」のオプションがあります。また、それらが表示される順序。したがって、スタックビューの要素の順序を逆にする必要があります。

Semantic selector in IB

または、ビューのsemanticContentAttributeを使用してコードで実行できます

stackView.semanticContentAttribute = .forceRightToLeft
18
Josh Heald

2つのUIStackViewsを含む水平方向のUIViewがありました。ビューの1つを非表示にすると、他のビューが全幅に広がります。残りのビューに幅の制約を追加すると、目的の幅が維持されますが、右に移動しました。

TL; DR

スタックビューに非表示のUIViewを追加します。これは、他のスペーシングがスペースのために非表示になったときに表示されます。

3
Tom Howard

私にとって最も効果的なのは、水平スタックビューを垂直スタックビュー内に配置し、垂直スタックビューをリーディングに設定することでした

3
Rachel Harvey

他の答えとは異なり、ソリューションは実際には非常に簡単です。必要なのは、スタックビューをスーパービューのトレーリングエッジに固定するトレーリング制約を追加し、スーパービューのリーディングエッジに固定するリーディング制約を追加することです。

ただし、重要なのは、主要なスタックビューの制約関係をequalから以上に変更することです。

これにより、スタックビューのリーディングエッジがスタックビューのコンテンツの固有の幅にスナップし、すべてをトレーリングエッジに効果的に固定できます。

垂直スタックビューも同様です。上部に等しいを固定し、下部を以下に固定します。

そう:

stackView.leadingAnchor.constraint(greaterThanOrEqualTo: parent.leadingAnchor).isActive = true

stackView.trailingAnchor.constraint(equalTo: parent.trailingAnchor).isActive = true

stackView.distribution = .equalSpacing
1
Michael Long