UIImageView изображение не обновляется визуально, когда установлено свойство изображения - PullRequest
0 голосов
/ 10 июня 2018

У меня есть UIImageView, чье взаимодействие с пользователем является истинным и которому я дал распознаватель жестов касания, чей обработчик действий выглядит следующим образом:

@IBAction func tap(_ sender:UITapGestureRecognizer) {
    let iv = sender.view as! UIImageView
    let im = iv.image!
    let im2 = UIGraphicsImageRenderer(size:im.size).image { _ in
        UIColor.red.setFill()
        UIBezierPath(rect: CGRect(origin:.zero, size:im.size)).fill()
    }
    iv.image = im2
}

Я ожидаю, что отображаемое изображение при касании изображениявид, подлежащий замене сплошным красным изображением.Это отлично работает на моей машине High Sierra под Xcode 9.4.Но на моем Sierra MacBook под Xcode 9.2 ничего не происходит.

Это странно.Сделав паузу в отладчике, я вижу, что новое изображение создается правильно:

enter image description here

Изображение заменяется , но представление изображения не перерисовывается.Добавление вызовов типа setNeedsDisplay ничего не делает.

Более того, если я затем продолжу заменять изображение представления изображения на другое изображение, я вижу красное изображение!

    iv.image = im2
    delay(0.5) {
        iv.image = im // causes im2 to appear!
    }

Некоторое закулисное кэширование, очевидно, заставляет представление изображения отставать в отображении на одно изображение.

Может кто-нибудь пролить свет на это?Это, вероятно, ошибка в самой iOS, и, возможно, в 9.2 конкретно;как можно обойти это?(Очевидно, что можно заменить другой просмотр изображений оптом, но это не скажет нам, что происходит с кэшированием.)

1 Ответ

0 голосов
/ 10 июня 2018

Похоже, что это обходной путь:

iv.image = im2
delay(0.05) {
    iv.image = nil
    iv.image = im2
}

Но что за ужас ... Пропустить любое из этих назначений или уменьшить значение delay до нуля (например, вызвав вместо этого DispatchQueue.main.async),приводит к сбою обходного пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...