[英]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) function 沒有被調用。 圓圈沒有畫。
你知道為什么嗎?
圖層對繪圖非常懶惰。 除非您告訴他們需要,否則他們不會畫畫。 因此,您可以通過顯式告訴層setNeedsDisplay
來解決這里的問題。
然而,觀點更積極一些。 他們在某些情況下會自動重新繪制自己,比如他們第一次出現時。 由於該層是視圖的底層,因此如果您可以讓視圖自動重繪自身,則可以讓該層參與自動重繪。
但是(這是重要的部分)運行時,為了效率,假設如果視圖沒有drawRect
實現,則不需要自動重繪。
所以這是你的答案:
通常情況下,一個層根本不會重繪,除非你告訴它。
通過提供drawRect
實現,即使它是空的,您也可以告訴視圖在需要時自動重繪自身。
這是視圖的底層,因此它會隨視圖一起重繪。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.