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
}
}
我實例化一個視圖控制器榫文件,並顯示該視圖模態的視圖控制器。
會發生什麼情況是draw
方法只有在父視圖已在屏幕上約20秒時才被調用。
我檢查了intrinsicContentSize
,並沒有返回.zero
這是堆棧的樣子,一旦它被稱爲:
任何想法可能是什麼造成的?
我把它叫做在子視圖本身和它的作品。但我不明白爲什麼我應該這樣做。通常我的觀點不應該意識到有自定義繪圖代碼的子視圖。我認爲,當視圖被顯示時,它應該至少繪製一次。 –
不確定。在繪製方法中設置一個斷點並查看它的調用時間。查看堆棧跟蹤以查看它從哪裏調用。 –