2016-11-23 49 views
1

我製作了一個UIView子類,它實現了自定義繪圖。下面是代碼(請不要介意,這可以通過一個UIImageView來完成。我刪除所有額外的代碼只是爲了說明問題)查看drawRect僅在延遲後調用

@IBDesignable 
class TPMSkinnedImageView: UIView { 
    private var originalImage:UIImage? 
    private var skinnedImage:UIImage? 

    @IBInspectable var image: UIImage? { 
     set { 
      originalImage = newValue 

      if(newValue == nil) { 
       skinnedImage = nil 
       return 
      } 

      skinnedImage = originalImage! 

      self.invalidateIntrinsicContentSize() 
      self.setNeedsDisplay() 
     } 

     get { 
      return originalImage 
     } 
    } 

    override func draw(_ rect: CGRect) { 
     let context:CGContext! = UIGraphicsGetCurrentContext() 
     context.saveGState() 
     context.translateBy(x: 0, y: rect.height) 
     context.scaleBy(x: 1, y: -1) 
     context.draw(skinnedImage!.cgImage!, in: rect) 
     context.restoreGState() 
    } 

    override var intrinsicContentSize: CGSize { 
     if(skinnedImage != nil) { 
      return skinnedImage!.size 
     } 

     return CGSize.zero 
    } 
} 

我實例化一個視圖控制器榫文件,並顯示該視圖模態的視圖控制器。

會發生什麼情況是draw方法只有在父視圖已在屏幕上約20秒時才被調用。

我檢查了intrinsicContentSize,並沒有返回.zero

這是堆棧的樣子,一旦它被稱爲:

enter image description here

任何想法可能是什麼造成的?

回答

1

嘗試調用你的看法setNeedsDisplay()在您的視圖控制器的viewWillAppear()

+0

我把它叫做在子視圖本身和它的作品。但我不明白爲什麼我應該這樣做。通常我的觀點不應該意識到有自定義繪圖代碼的子視圖。我認爲,當視圖被顯示時,它應該至少繪製一次。 –

+0

不確定。在繪製方法中設置一個斷點並查看它的調用時間。查看堆棧跟蹤以查看它從哪裏調用。 –