2016-11-23 5 views
1

Я сделал подкласс UIView, который реализует пользовательский чертеж. Вот код (пожалуйста, не забывайте, что это может быть сделано с помощью UIImageView. Я разделся кодом всех статистов, чтобы показать проблему)View 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 бобов и шоу viewcontroller модально.

Что происходит, так это то, что метод draw вызывается только тогда, когда родительский вид находился на экране около 20 секунд.

Я проверил intrinsicContentSize и он не возвращает .zero

Это то, что стек выглядит как только он называется:

enter image description here

Любая идея, что может быть причиной этого?

ответ

1

Try вызова setNeedsDisplay() на ваш взгляд, на ваш взгляд диспетчерское viewWillAppear()

+0

Я назвал это на самом подвид, и она работает. Но я не понимаю, почему я должен это делать. Обычно мой взгляд не должен знать о том, что есть подзоны с пользовательским кодом чертежа. Я бы подумал, что он должен нарисовать его хотя бы один раз, когда будет показано представление. –

+0

Не уверен. Установите контрольную точку в методе рисования и посмотрите, когда она вызывается. Посмотрите на трассировку стека, чтобы узнать, откуда она вызвана. –

Смежные вопросы