UIStackView
Android に似ていますLinearLayout
が、サブビューの重みを設定する方法がわかりませんでした。
垂直UIStackView
と 3 UIImageView
s があるとします。s の重みを 3、6、1 と連続して設定したいUIImageView
。それ、どうやったら出来るの?
UIStackView
Android に似ていますLinearLayout
が、サブビューの重みを設定する方法がわかりませんでした。
垂直UIStackView
と 3 UIImageView
s があるとします。s の重みを 3、6、1 と連続して設定したいUIImageView
。それ、どうやったら出来るの?
UIStackView
重みの同じ概念はありません。サブビューintrinsicContentSize
を重みとして使用できますが、特定のものを設定するintrinsicContentSize
には、通常、サブクラスを作成する必要があり、他の状況でも使用されandroid:layout_weight
ます (おなじみの属性とは異なり、 でのみ使用されLinearLayout
ます)。
ただし、UIStackView
配置されたサブビューに制約を適用することで機能するため、サブビューの高さの間に追加の制約を設定することで、重みの効果を得ることができます。(UIStackView
独自の制約を追加して、このようにレイアウトを微調整できるように設計されています。)
あなたのケースでは、トップ ビューの高さをボトム ビューの高さの 3 倍に制限し、ミドル ビューの高さをボトム ビューの高さの 6 倍に制限したいと考えています。
等高制約を作成してから、制約の乗数を編集することで、ストーリーボードに比例高制約を設定できます。
コードでは、次のようにすることができます (iOS 9.0 以降)。
NSLayoutConstraint.activateConstraints([
top.heightAnchor.constraintEqualToAnchor(bottom.heightAnchor, multiplier: 3),
middle.heightAnchor.constraintEqualToAnchor(bottom.heightAnchor, multiplier: 6),
])
まず、これには本当にスタック ビューが必要ですか? 比例的な高さの制約を直接使用するだけで、これを調整する方がはるかに簡単です。
ただし、本当にスタック ビューを使用する場合は、スタック ビューを使用してこれを行うことができます。その秘密は、問題の「重み」が単に配置されたビューのintrinsicContentSize().height
. これを知っていれば、要求された比率の 3 つの画像ビューで構成されるスタック ビューを簡単に設定できました。
これらは、デモンストレーションの目的で、同じ画像を 3 回繰り返したものです。
どうやってそれをしたのですか?ストーリーボードで、3 つの画像ビューtag
の値をそれぞれ 300、600、100 にしました。(もちろん、これには IBInspectable カスタム プロパティを使用することもできました。実際にはそうするでしょう。)次に、UIImageView サブクラス MyImageView のすべてのインスタンスを作成しました。コードは次のようになります。
class MyImageView: UIImageView {
override func intrinsicContentSize() -> CGSize {
print(self.tag)
return CGSizeMake(CGFloat(self.tag), CGFloat(self.tag))
}
}
スタック ビューの分布は、比例的に塗りつぶすように構成されています。画像ビューは、コンテンツ モードが Scale To Fill として設定されています。結果: スタック ビューは、配置されたビューをレイアウトする際にintrinsicContentSize
メソッドを参照し、正しいことを行います。