簡體   English   中英

為什么不調用 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) function 沒有被調用。 圓圈沒有畫。 在此處輸入圖像描述

你知道為什么嗎?

圖層對繪圖非常懶惰。 除非您告訴他們需要,否則他們不會畫畫。 因此,您可以通過顯式告訴層setNeedsDisplay來解決這里的問題。

然而,觀點更積極一些。 他們在某些情況下會自動重新繪制自己,比如他們第一次出現時。 由於該層是視圖的底層,因此如果您可以讓視圖自動重繪自身,則可以讓該層參與自動重繪。

但是(這是重要的部分)運行時,為了效率,假設如果視圖沒有drawRect實現,則不需要自動重繪。

所以這是你的答案:

  1. 通常情況下,一個層根本不會重繪,除非你告訴它。

  2. 通過提供drawRect實現,即使它是空的,您也可以告訴視圖在需要時自動重繪自身。

  3. 這是視圖的底層,因此它會隨視圖一起重繪。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM