Я сделал подкласс 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
Это то, что стек выглядит как только он называется:
Любая идея, что может быть причиной этого?
Я назвал это на самом подвид, и она работает. Но я не понимаю, почему я должен это делать. Обычно мой взгляд не должен знать о том, что есть подзоны с пользовательским кодом чертежа. Я бы подумал, что он должен нарисовать его хотя бы один раз, когда будет показано представление. –
Не уверен. Установите контрольную точку в методе рисования и посмотрите, когда она вызывается. Посмотрите на трассировку стека, чтобы узнать, откуда она вызвана. –