为什么在没有空draw_ rect:CGRect的情况下不调用draw_ layer:CALayer,在ctx:CGContext中?

问题描述

当我覆盖 draw(_ rect:CGRect)并将其留空时,就会发生调用draw(_层:CALayer,在ctx:CGContext)的情况。然后画圆。

enter image description here

这是代码。我刚刚分配了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)函数。并且圆没有被绘。

enter image description here

你知道为什么吗?

解决方法

层对绘画非常懒惰。除非您告诉他们需要,否则它们不会绘图。因此,您可以在此处通过明确告知setNeedsDisplay层来解决问题。

但是,视图更加主动。他们会在某些情况下自动重绘,例如第一次出现时。由于此层是视图的基础层,因此,如果可以使视图自动重绘,则可以使该层参与该自动重绘。

但是(为了确保效率,运行时(这是重要的部分),运行时假设如果视图具有 no drawRect实现,则不需要自动重绘。 / p>

所以有您的答案:

  1. 通常,除非您告知某个图层,否则它根本不会重绘。

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

  3. 这是视图的基础层,因此会随视图重新绘制。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...