0

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

  • 高さはに変更され300invalidateIntrinsicContentSize()呼び出されます

  • インスタンスを InterfaceBuilderに配置すると、MyView問題なく動作します。ビューは高さの制約を必要としません

ただし、IB では の初期の高さ50が使用されます。なんで?IB は灰色の四角形を描画するため、drawメソッドが呼び出されます。では、なぜ高さが 300 に変更されないのでしょうか。

また奇妙なこと: 背景色を設定すると、それも描画されますが、super.draw(...)呼び出されません。これは意図したものですか?

30025_ ただし、シミュレーターでプロジェクトを実行すると、結果は異なります。

  • ビューの高さ = 300- OK
  • コンテンツの高さ (= 灰色の四角形) = 150 (ビューの高さの半分) - OK ではありません

25ビューに対する相対的な高さを維持するために、コンテンツが元の高さから引き伸ばされたようです。どうしてこれなの?

ここに画像の説明を入力

4

1 に答える 1