1. ホーム
  2. ios9

[解決済み] UIStackViewの表示間隔を変更するには?

2023-05-20 01:33:35

質問

私は、シンプルな横型の UIStackView の中にいくつかの UIViews が積み重ねられています。 私の目標は、ビュー間の可変間隔を作成することです。 私は、"spacing"プロパティを使用してサブビューの間に一定のスペースを作成できることをよく理解しています。 しかし、私の目標は、可変スペースを作成することです。 可能な限り、スペーサーとして機能する不可視のビューを使用することは避けたいと考えていることに注意してください。

私が思いついた最良の方法は、私の UIViews を別の UIStackView を使用し layoutMarginsRelativeArrangement = YES を使用して、内部スタックのレイアウトマージンを尊重します。 私は、同様のことを任意の UIView で同じようなことができればと思っていました。 以下は私のサンプル コードです。

// Create stack view
UIStackView *stackView = [[UIStackView alloc] init];
stackView.translatesAutoresizingMaskIntoConstraints = NO;
stackView.axis = UILayoutConstraintAxisHorizontal;
stackView.alignment = UIStackViewAlignmentCenter;
stackView.layoutMarginsRelativeArrangement = YES;

// Create subview
UIView *view1 = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO;
// ... Add Auto Layout constraints for height / width
// ...
// I was hoping the layoutMargins would be respected, but they are not
view1.layoutMargins = UIEdgeInsetsMake(0, 25, 0, 0);

// ... Create more subviews
// UIView view2 = [[UIView alloc] init];
// ...

// Stack the subviews
[stackView addArrangedSubview:view1];
[stackView addArrangedSubview:view2];

結果は、間隔をあけてすぐ隣にビューがあるスタックになります。

どのように解決するのですか?

iOS 11のアップデートで、StackViewsにカスタムスペーシングが追加されました。

Apple は、iOS 11 でカスタムスペーシングを設定する機能を追加しました。 配置された各サブビューの後に間隔を指定するだけです。 残念ながら、前に間隔を指定することはできません。

stackView.setCustomSpacing(10.0, after: firstLabel)
stackView.setCustomSpacing(10.0, after: secondLabel)

それでも、独自のビューを使うよりはずっと良い。

iOS10以下の場合

スタックビューに透明なビューを追加して、それらに幅の制約を追加するだけでよいでしょう。

(ラベル - UIView - ラベル - UIView -Label)

で、もし distribution を埋めるようにすれば、UIViewsに可変幅の制約を設定することができます。

しかし、私はこれが正しい状況であれば、スタックビューを使用することを検討します。 Autolayoutを使用すると、ビュー間で可変幅を設定するのが非常に簡単になります。