2016-11-23 98 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

不确定。在绘制方法中设置一个断点并查看它的调用时间。查看堆栈跟踪以查看它从哪里调用。 –