web-dev-qa-db-ja.com

UIStackView内に追加されたビューに先頭のパディングを追加する方法

これが私の設定です。先頭に0に設定された試行のEdgeを持つUIScrollViewがあります。この中に、この制約を持つUIStackViewを追加します。

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

スタックビュー内にいくつかのビューを追加します。
私の問題は、制約のために、スタックビューに追加された最初のビューのリーディングエッジが0になることです。

最初のビューにパディングを追加する方法は何ですか?スクロールビューの制約を調整しません。

94
Adrian

あなたが提供したソリューションは、UIStackView内にビューのパディングを追加しません(質問で望んだように)が、UIStackViewのリーディングを追加します。

解決策は、元のUIStackView内に別のUIStackViewを追加し、この新しいUIStackVIewへのリードを与えることです。次に、この新しいUIStackViewにビューを追加します。

ヒント、Interface Builderを使用して完全に行うことができます。つまり、そのためのコードを記述する必要はありません。

23
William Kinaan

isLayoutMarginsRelativeArrangementプロパティがtrueの場合、スタックビューは、レイアウトマージンを基準にして配置されたビューをレイアウトします。

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

ただし、スタックビュー内に配置されたすべてのビューに影響します。配置された1つのビューだけにこのパディングが必要な場合は、ネストされたUIStackViewを使用する必要があります

306
Tolga Okur

スタックビュー内では制約が機能しないか、やや奇妙に見えることがわかりました。

(画像スタックビューの選択にリーディング/トレーリング制約を追加するように、それはコレクションビューにもリーディングを追加しますが、トレーリングは追加しません;そしてそれは確かに競合します)。

stackview inside stackview

Stackview内のすべてのビューのレイアウトマージンを設定するには、次を選択します。

Stack View > Size Inspector > Layout Margins > Fixed

注:スクリーンショットに見られるように、"Fixed"オプションは以前"Explicit"と呼ばれていました。

次に、パディングを追加します。

storyboard

私のために働いたのは、単なるスペーサーである別のUIViewをスタックビューに追加することです(少なくともstackView.distribution = .Fillで動作します):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...
13
dorsz

Swift 3:次の方法でオフセットを設定するだけです。

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

parentView.addArrangdSubView(firstView)の後にこの制約が設定されていることを確認してください

5
William Hu

先頭のパディングだけが必要な場合は、スタックビューのAlignmentを「Trailing」に設定すると、含まれるサブビューのそれぞれに一意のLeading制約を自由に指定できます。

ボーナスとして、スタックビューの配置を「中央」に設定してから、先行および/または後続の制約を使用して、各アイテムに両側に独自のパディングを与えることもできます。

3
Jonathan Parham

この質問にはすでに良い答えがありますが、1つの提案として、spacingプロパティを使用してビュー間の間隔を設定します。最初と最後のビューには、@ tolppが推奨するようにインセットを設定するか、パディングを追加する定数を使用して親に制約を追加する(スタックビュー)の2つのオプションがあります。

1
infiniteLoop

私たちがしたことは、透明なコンポーネント(UIButton/UIViewなど)をUIStackViewの最初と最後の子として追加することでした。次に、これらの非表示の子の幅を制限して、パディングを調整します。

0
Crashalot