2016-11-23 5 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 
    } 
} 

私はViewControllerをnibファイルやショーでこのビューをインスタンスでありますビューコントローラはモーダルです。

何が起こるかは、親ビューが約20秒間画面に表示されているときにのみdrawメソッドが呼び出されるということです。

私はintrinsicContentSizeをチェックし、それは、これは、スタックは、それが呼ばれた後のように見えるものである.zero

を返しません:

enter image description here

これを引き起こしている可能性がどのような任意のアイデア?

答えて

1

は、私はサブビュー自身でそれを呼び、それが動作あなたのビューコントローラのviewWillAppear()

+0

であなたのビューにsetNeedsDisplay()を呼び出してみてください。しかし、なぜ私はこれをすべきか理解していません。通常、私の見解では、カスタム図面コードのサブビューがあるという事実を認識すべきではありません。ビューが表示されたら、少なくとも1回は描画する必要があります。 –

+0

わかりません。描画メソッドにブレークポイントを設定し、呼び出されたタイミングを確認します。スタックトレースを見て、どこから呼び出されたかを確認します。 –

関連する問題