IntrinsicContentSize を使用/提供するカスタムを作成したいと思います。UIView
これは、高さがコンテンツに依存するためです (高さがテキストに依存するラベルのように)。
既存のビューによって提供される IntrinsicContentSize の操作方法に関する多くの情報を見つけましたが、カスタムで IntrinsicContentSize を使用する方法については、ほんの少ししか見つかりませんでしたUIView
。
@IBDesignable class MyIntrinsicView: UIView {
override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
context?.setFillColor(UIColor.gray.cgColor)
context?.fill(CGRect(x: 0, y: 0, width: frame.width, height: 25))
height = 300
invalidateIntrinsicContentSize()
}
@IBInspectable var height: CGFloat = 50
override var intrinsicContentSize: CGSize {
return CGSize(width: super.intrinsicContentSize.width, height: height)
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
invalidateIntrinsicContentSize()
}
}
初期高値は
50
メソッドは、サイズの
draw
灰色の四角形を描画します25
高さはに変更され
300
、invalidateIntrinsicContentSize()
呼び出されますインスタンスを InterfaceBuilderに配置すると、
MyView
問題なく動作します。ビューは高さの制約を必要としません
ただし、IB では の初期の高さ50
が使用されます。なんで?IB は灰色の四角形を描画するため、draw
メソッドが呼び出されます。では、なぜ高さが 300 に変更されないのでしょうか。
また奇妙なこと: 背景色を設定すると、それも描画されますが、super.draw(...)
呼び出されません。これは意図したものですか?
高300
さ25
_ ただし、シミュレーターでプロジェクトを実行すると、結果は異なります。
- ビューの高さ =
300
- OK - コンテンツの高さ (= 灰色の四角形) = 150 (ビューの高さの半分) - OK ではありません
25
ビューに対する相対的な高さを維持するために、コンテンツが元の高さから引き伸ばされたようです。どうしてこれなの?