web-dev-qa-db-ja.com

Swiftでカスタムビューの固有のコンテンツサイズを設定する方法は?

背景

伝統的なモンゴル文字で使用する垂直ラベルを作成しています。以前はUILabelを回転させていましたが、これにはパフォーマンスの問題やその他の複雑な問題がありました。現在、私は最初からラベルを作ることに取り組んでいます。ただし、(文字列の長さに基づいて)高さが調整されたときに自動レイアウトを通知する垂直ラベルが必要です。

私が読んだもの

Intrinsic Content Size および Views with Intrinsic Content Size ドキュメントを読みました。ただし、これらは使用方法に関するものであり、カスタムビューで定義する方法ではありません。

「カスタムビューのiOS固有のコンテンツサイズ」を検索すると、

スタックオーバーフロー。この特定の質問は、ビューが標準ビューの単なるアセンブリであるため、固有のコンテンツサイズさえ必要としませんでした。

私が試していること

私が試みているのは、以下の私の答えです。このQ&Aペアを追加して、使用した検索キーワードで他の人が答えを見つけるのに時間がかからないようにします。

39
Suragch

カスタムビューの固有のコンテンツサイズを設定すると、自動レイアウトでそのビューの大きさを知ることができます。設定するには、intrinsicContentSizeをオーバーライドする必要があります。

_override var intrinsicContentSize: CGSize {
   return CGSize(width: x, height: y)
}
_

それから電話する

_invalidateIntrinsicContentSize()
_

カスタムビューの固有のコンテンツサイズが変更され、フレームを更新する必要がある場合。

76
Suragch

「固有の高さを持つビュー」の例...

@IBDesignable class HView: UIView {

    @IBInspectable var height: CGFloat = 100.0

    override var intrinsicContentSize: CGSize {
        return CGSize(width: 99, height: height)
        // if using in, say, a vertical stack view, the width is ignored
    }

    override func prepareForInterfaceBuilder() {
         invalidateIntrinsicContentSize()
    }
}

enter image description here

検査可能として設定できます

enter image description here

固有の高さがあるため、(たとえば)コードのスタックビューにすぐに挿入できます。

stack?.insertArrangedSubview(HView(), at: 3)

対照的に、固有の高さのない通常のビューである場合、高さアンカーを追加する必要があります。追加しないとクラッシュします。

let v:UIView = HView()
v.heightAnchor.constraint(equalToConstant: 100).isActive = true
stack?.insertArrangedSubview(v, at: 3)

に注意してください...

スタックビューの重要な特別な場合:

  • [〜#〜] one [〜#〜]アンカーのみを設定します(垂直スタックビューの場合、高さ、水平の場合は幅)

したがって、固有の高さの設定は完全に機能します。

  • 実際、固有の高さは、必要に応じて具体的に高さアンカーが自動的に設定されることを意味します。

サブビューのすべての通常の場合、他の多くのアンカーが必要であることを思い出してください。

9
Fattie