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
这是堆栈的样子,一旦它被称为:
任何想法可能是什么造成的?
我把它叫做在子视图本身和它的作品。但我不明白为什么我应该这样做。通常我的观点不应该意识到有自定义绘图代码的子视图。我认为,当视图被显示时,它应该至少绘制一次。 –
不确定。在绘制方法中设置一个断点并查看它的调用时间。查看堆栈跟踪以查看它从哪里调用。 –