UIStackView
の内側にUIScrollView
があり、動的に追加されたサブビューを水平に配置して表示します。現在のソリューションは左からアイテムの表示を開始します。サブビューの幅と高さを変更せずにアイテムを中央から配布したいと思います。それ、どうやったら出来るの?また、UIStackView
を使用しないソリューションにも対応しています。そうすれば、iOS9未満のデバイスをサポートできます。
(現在)
(期待される)
短い答え:
ScrollViewの制約
Leading >= 0, Trailing >= 0, Top >= 0, Bottom >= 0
Center X and Center Y
StackViewの制約
Leading = 0, Trailing = 0, Top = 0, Bottom = 0
StackView width = ScrollView width (priority low :250)
StackView height = ScrollView height
長い答え
まず、あなたの構造は良いです、私たちは持っています:
UIScrollView
UIStackView (horizontal)
Subviews
したがって、目標を達成するには、次のことを行う必要があります。
UIScrollView
を中央揃えUIScrollView
のcontentSizeをUIStackView
の固有のコンテンツサイズに等しく設定しますこれを行う方法は次のとおりです。
ステップ1:UIScrollViewのフレームを中央に配置します
CenterY
のフレームを中央に配置するために使用されるCenterX
およびUIScrollView
制約
Leading Space
> = 0、Trailling Space
> = 0、Top Space
> = 0、Bottom Spac
e> = 0は、UIScrollViewのフレームが親ビューのフレームを超えないようにするために使用されます
UIScrollView
のcontentSizeに関連するエラーを表示しないように、プレースホルダーの固有サイズを使用しました(contentSizeにはまだサブビューがないため)。
さて、UIScrollView
のフレームはOKです。次のステップに進んでください:)
ステップ2:水平UIStackViewを追加します
PS。 UIStackViewのフレームの変更、UIScrollViewのcontentSizeの変更
ステップ3:サブビューを追加する
Fill Distribution
in UIStackView
all subviews
には、固有のコンテンツサイズ(または高さと幅の制約(推奨されません))が必要です。たとえば、Fill Equally
、固有のコンテンツサイズ(または高さと幅の制約(推奨されない))を持つ1つのsubview
のみで十分です。他のサブビューのサイズはこれと同じになります。
例:3つのラベルを追加します(UIScrollView
のプレースホルダー固有のサイズを削除してください)
できます !!いいえ、いいえ、まだ4番目と5番目のラベルを追加しようとはしていません:)
なぜ?
理解するために、ビューの各要素のフレームを2つの例で計算します。
親ビューのサイズ:200、200最初のラベルの固有のコンテンツサイズ:120、50 2番目のラベルの固有のコンテンツサイズ:150、50
最初の例(UIStackView
の最初のラベルのみ)
UIStackView
固有のコンテンツサイズ= 120、50UIScrollView
contentSize = 120、50UIScrollView
フレーム= 40、75、120、50すべてのフレームに問題はありません
2番目の例(2つのラベルを使用)
UIScrollView
フレーム= 0、0、200、50UIScrollView
contentSize = 200、50UIStackView
固有のコンテンツサイズ= 200、50そのため、UIStackView
は2つのラベルを正しく表示できず(UIStackView
の幅は2つのラベルの幅よりも小さいため)、UIStackView
制約の幅はUIScrollViewの幅と同じです。 UIStackView
固有のコンテンツサイズが最大UIScrollView
フレームよりも小さい場合に機能します。
これを修正するために、幅制約の優先度をUIStackView
固有のコンテンツサイズの優先度の値よりも低い値に変更すると、すべて正常に機能します。
お役に立てば幸いです。