UIImageの画像を更新しても反映されない

前提

要素 バージョン
xcode 8.2.1
Swift 3.0.2
iPhone 6s
iOS 10.2.1

問題

例えば以下のような、UIImageViewに描画しているUIImageを動的に書き換える関数がある

public func setImage(newImage: UIImage) {
  self.myImageView.image = newImage
  self.myImageView.setNeedsLayout()
}

通常であれば、この関数を呼び出すとUIImageViewに表示される画像が書き換わるが、
この関数を非同期で呼び出した場合に、変更後の画像が描画されない、もしくは表示までラグが生じてしまう

解決策

どうやら、非同期で画像を更新した場合には、その瞬間に再描画が行われず、別途再描画を行うタイミングで合わせて画像も再描画されるらしい。
とのことなので以下のようにコードを修正し、強制的にメインスレッドで実行することで、非同期で呼び出しても画像が即時更新されるようになった。

public func setImage(newImage: UIImage) {
  DispatchQueue.main.async {
    self.myImageView.image = newImage
    self.myImageView.setNeedsLayout()
  }
}

この問題はUIImageViewに関わらず、UIViewのサブクラス全般で起こりうる問題なので、備忘録として残しておく。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です