背景
伝統的なモンゴル文字で使用する垂直ラベルを作成しています。以前はUILabel
を回転させていましたが、これにはパフォーマンスの問題やその他の複雑な問題がありました。現在、私は最初からラベルを作ることに取り組んでいます。ただし、(文字列の長さに基づいて)高さが調整されたときに自動レイアウトを通知する垂直ラベルが必要です。
私が読んだもの
Intrinsic Content Size および Views with Intrinsic Content Size ドキュメントを読みました。ただし、これらは使用方法に関するものであり、カスタムビューで定義する方法ではありません。
「カスタムビューのiOS固有のコンテンツサイズ」を検索すると、
スタックオーバーフロー。この特定の質問は、ビューが標準ビューの単なるアセンブリであるため、固有のコンテンツサイズさえ必要としませんでした。
私が試していること
私が試みているのは、以下の私の答えです。このQ&Aペアを追加して、使用した検索キーワードで他の人が答えを見つけるのに時間がかからないようにします。
カスタムビューの固有のコンテンツサイズを設定すると、自動レイアウトでそのビューの大きさを知ることができます。設定するには、intrinsicContentSize
をオーバーライドする必要があります。
_override var intrinsicContentSize: CGSize {
return CGSize(width: x, height: y)
}
_
それから電話する
_invalidateIntrinsicContentSize()
_
カスタムビューの固有のコンテンツサイズが変更され、フレームを更新する必要がある場合。
注
invalidateIntrinsicContentSize()
のヘルプについて documentation にも感謝します。「固有の高さを持つビュー」の例...
@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()
}
}
検査可能として設定できます
固有の高さがあるため、(たとえば)コードのスタックビューにすぐに挿入できます。
stack?.insertArrangedSubview(HView(), at: 3)
対照的に、固有の高さのない通常のビューである場合、高さアンカーを追加する必要があります。追加しないとクラッシュします。
let v:UIView = HView()
v.heightAnchor.constraint(equalToConstant: 100).isActive = true
stack?.insertArrangedSubview(v, at: 3)
に注意してください...
したがって、固有の高さの設定は完全に機能します。
サブビューのすべての通常の場合、他の多くのアンカーが必要であることを思い出してください。