1
カスタム図面を実装するUIView
サブクラスを作成しました。ここでは、コード(これはUIImageView
によって行うことができることを気にしないでください。私は、問題を示すために、すべての余分のコードを剥奪)drawRectは遅延の後にのみ呼び出されます
@IBDesignable
class TPMSkinnedImageView: UIView {
private var originalImage:UIImage?
private var skinnedImage:UIImage?
@IBInspectable var image: UIImage? {
set {
originalImage = newValue
if(newValue == nil) {
skinnedImage = nil
return
}
skinnedImage = originalImage!
self.invalidateIntrinsicContentSize()
self.setNeedsDisplay()
}
get {
return originalImage
}
}
override func draw(_ rect: CGRect) {
let context:CGContext! = UIGraphicsGetCurrentContext()
context.saveGState()
context.translateBy(x: 0, y: rect.height)
context.scaleBy(x: 1, y: -1)
context.draw(skinnedImage!.cgImage!, in: rect)
context.restoreGState()
}
override var intrinsicContentSize: CGSize {
if(skinnedImage != nil) {
return skinnedImage!.size
}
return CGSize.zero
}
}
私はViewControllerをnibファイルやショーでこのビューをインスタンスでありますビューコントローラはモーダルです。
何が起こるかは、親ビューが約20秒間画面に表示されているときにのみdraw
メソッドが呼び出されるということです。
私はintrinsicContentSize
をチェックし、それは、これは、スタックは、それが呼ばれた後のように見えるものである.zero
を返しません:
これを引き起こしている可能性がどのような任意のアイデア?
であなたのビューに
setNeedsDisplay()
を呼び出してみてください。しかし、なぜ私はこれをすべきか理解していません。通常、私の見解では、カスタム図面コードのサブビューがあるという事実を認識すべきではありません。ビューが表示されたら、少なくとも1回は描画する必要があります。 –わかりません。描画メソッドにブレークポイントを設定し、呼び出されたタイミングを確認します。スタックトレースを見て、どこから呼び出されたかを確認します。 –