问题描述
当我覆盖 draw(_ rect:CGRect)并将其留空时,就会发生调用draw(_层:CALayer,在ctx:CGContext)的情况。然后画圆。
这是代码。我刚刚分配了SpecialView类以在IB中查看。
class SpecialView : UIView {
override func draw(_ rect: CGRect) {
}
override func draw(_ layer: CALayer,in ctx: CGContext) {
UIGraphicsPushContext(ctx)
let p = UIBezierPath(ovalIn: CGRect(0,100,100))
UIColor.blue.setFill()
p.fill()
UIGraphicsPopContext()
}
}
但是当我不覆盖 draw(_ rect:CGRect)时,只需将下面的代码留在代码段中即可
class SpecialView : UIView {
override func draw(_ layer: CALayer,100))
UIColor.blue.setFill()
p.fill()
UIGraphicsPopContext()
}
}
未调用 draw(_层:CALayer,在ctx:CGContext)函数。并且圆没有被绘。
你知道为什么吗?
解决方法
层对绘画非常懒惰。除非您告诉他们需要,否则它们不会绘图。因此,您可以在此处通过明确告知setNeedsDisplay
层来解决问题。
但是,视图更加主动。他们会在某些情况下自动重绘,例如第一次出现时。由于此层是视图的基础层,因此,如果可以使视图自动重绘,则可以使该层参与该自动重绘。
但是(为了确保效率,运行时(这是重要的部分),运行时假设如果视图具有 no drawRect
实现,则不需要自动重绘。 / p>
所以有您的答案:
-
通常,除非您告知某个图层,否则它根本不会重绘。
-
通过提供一个
drawRect
实现,即使它为空,也可以告诉 view 在需要时自动重绘。 -
这是视图的基础层,因此会随视图重新绘制。