为什么不调用 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
实现,它不会需要自动重绘。
这就是你的答案:
通常情况下,图层根本不会重绘,除非您告诉它。
通过提供 drawRect
实现,即使它是空的,您也可以告诉 view 在需要时自动重绘。
这是view的底层,所以和view一起重绘
当我覆盖 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
实现,它不会需要自动重绘。
这就是你的答案:
通常情况下,图层根本不会重绘,除非您告诉它。
通过提供
drawRect
实现,即使它是空的,您也可以告诉 view 在需要时自动重绘。这是view的底层,所以和view一起重绘