11

UIStackViewAndroid に似ていますLinearLayoutが、サブビューの重みを設定する方法がわかりませんでした。

垂直UIStackViewと 3 UIImageViews があるとします。s の重みを 3、6、1 と連続して設定したいUIImageView。それ、どうやったら出来るの?

レイアウト図

4

3 に答える 3

8

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),
])
于 2015-12-08T16:33:50.633 に答える
0

まず、これには本当にスタック ビューが必要ですか? 比例的な高さの制約を直接使用するだけで、これを調整する方がはるかに簡単です。

ただし、本当にスタック ビューを使用する場合は、スタック ビューを使用してこれを行うことができます。その秘密は、問題の「重み」が単に配置されたビューの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メソッドを参照し、正しいことを行います。

于 2015-12-08T17:08:41.337 に答える