为什么不调用 draw(_ layer: CALayer, in ctx: CGContext) 没有空 draw(_ rect: CGRect)?

Why draw(_ layer: CALayer, in ctx: CGContext) is not called without empty draw(_ rect: CGRect)?

当我覆盖 draw(_ rect: CGRect) 并将其留空时,碰巧调用了 draw(_ layer: CALayer, in ctx: CGContext)。并绘制圆圈。

这是代码。我刚刚分配了 SpecialView class 在 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,0,100,100))
            UIColor.blue.setFill()
            p.fill()
            UIGraphicsPopContext()
   }

}

但是当我不覆盖 draw(_ rect: CGRect) 时,只需在代码片段中保留如下代码:

 class SpecialView : UIView {
 
   override func draw(_ layer: CALayer, in ctx: CGContext) {
            UIGraphicsPushContext(ctx)
            let p = UIBezierPath(ovalIn: CGRect(0,0,100,100))
            UIColor.blue.setFill()
            p.fill()
            UIGraphicsPopContext()
   }
}

未调用draw(_ layer: CALayer, in ctx: CGContext)函数。圆圈没有画。

你知道为什么吗?

图层懒得画了。除非您告诉他们需要,否则他们不会画画。因此,您可以通过显式告诉图层 setNeedsDisplay.

来解决这里的问题

但是,观看次数 更主动一些。他们在某些情况下会自动重新绘制自己,比如他们第一次出现时。由于该层是视图的底层,如果能让视图自动重绘,就可以让该层参与自动重绘。

但是(这是重要的部分)运行时,为了效率,假设如果视图有 no drawRect 实现,它不会需要自动重绘。

这就是你的答案:

  1. 通常情况下,图层根本不会重绘,除非您告诉它。

  2. 通过提供 drawRect 实现,即使它是空的,您也可以告诉 view 在需要时自动重绘。

  3. 这是view的底层,所以和view一起重绘