2016-02-16 13 views
15

UIScrollViewの中にはUIStackViewがあり、動的に追加されたサブビューを水平に並べて表示します。現在のソリューションは左からアイテムを表示し始めます。サブビューの幅と高さを変更することなく、中心からアイテムを配布したいと思います。それ、どうやったら出来るの?私はまた、UIStackViewを使用しないソリューションにもオープンしています。そうすれば、私はデバイスをサポートすることができます< iOS9。UIStackView - 中央から均等にビューを配信する

Curent

Expected

を期待)(現在

+0

SwiftまたはObjective Cで作業していますか? –

+0

Swift 2.0を扱っているIm – r3dsm0k3

+0

stackViewの中の3でsubViewの量を上限にしますか? – Adrian

答えて

14

短い答え:

のSc rollView制約

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 

をので、目標を達成するために、我々は:

  • センターUIStackView
ここ

それを行う方法であるの本質的な内容 サイズにUIScrollView同等のcontentSizeを設定UIScrollView

  • ステップ1:センターUIScrollViewのフレーム

    enter image description here

    CenterY

    CenterXUIScrollView

    Leading Space> = 0、Trailling Space> = 0のフレームをセンタリングするために使用される制約、Top Space> = 0、Bottom Spac E> = 0はUIScrollViewのフレームを防止するために使用されます

    UIScrollViewのcontentSizeに関連するエラーを表示しないために、プレースホルダ固有のサイズを使用しました(contentSizeのサブビューがないため)。

    今、私たちのUIScrollViewのフレームがOKで、次のステップ:)

    ステップ2に進みます:水平UIStackView

    enter image description here

    • トップ、ボトムを追加し、リードします後続の制約を使用して固定する。 UIStackViewフレーム
    • 等価高さと等幅を計算に使用するe content UIScrollViewのサイズ

    PS。 UIStackViewのフレーム内のすべての変更は、UIScrollViewのをcontentSize

    ステップ3を変更:我々は固有のコンテンツサイズ(高さと幅を持たなければならないUIStackViewすべてsubviewsFill Distributionを使用しているためサブビューに

    を追加します制約(望ましくない))。 たとえば、Fill Equallyを使用する場合、内在コンテンツサイズ(または高さと幅の制​​約(推奨しません))を持つsubviewの1つのみで十分です。他のサブビューのサイズはこれと同じになります。例については

    :私はそれが動作する3つのラベル(UIScrollViewのプレースホルダ本来のサイズを削除してください)

    enter image description here

    が追加されます!いいえ、いいえ、まだ4番目と5つのラベルを追加しようとしていません:)

    なぜですか?

    親ビューのサイズ:200、200 最初のラベル固有コンテンツサイズ:我々は、2つの例とビューの各要素のフレーム計算し理解する

    120を、50 第二の標識真性コンテンツサイズ:150、50

    第1の例(UIStackViewでのみ最初のラベル)

    • UIStackView固有コンテンツサイズ= 120、50
    • UIScrollView contentSize = 120、50
    • UIScrollViewフレーム= 40、75、120、50

    すべてのフレームが

    第二の例(OKであります2つのラベル付き)

    • UIScrollView = 0、0、200、50
    • UIScrollView contentSize = 200、50
    • UIStackView固有コンテンツサイズ= 200、50だから

    フレーム、UIStackViewが正しく2つのラベルを表示することができない(なぜならUIStackViewの幅が2つのラベルの幅よりも小さい)、スクロールしないため、UIStackViewという制約の幅がUIScrollViewの幅と等しいためです。 UIStackView本来のコンテンツサイズが最大UIScrollViewフレームよりも小さい場合に機能します。それを解決するには

    は、我々はUIStackView固有のコンテンツサイズ優先値よりも低い値に幅の制約の優先順位を変更し、すべてが正常に動作します:)

    enter image description here

    お役に立てば幸いです。

    Code source

  • +0

    素晴らしい仕事!どうもありがとうございます! –

    +0

    ようこそ@VladPulichev、ありがとうあなたのような言葉 –

    関連する問題