なんとかするから、なんとかなる

エンジニア関係のことを書きます

iOS UIView自身で画面表示時にアニメーションすることは難しい

English version below

はじめに

UIView自身で画面に表示されるたびにアニメーションを実行したかったのですが、方法が思いつかなくて挫折した話です。

結論

  • UIViewControllerからメソッド呼ぶか
  • 画面表示イベントの通知を受け取る

雑記的な話

UIViewのライフサイクルメソッドといえば、drawRect:やlayoutSubviews()、didMoveToWindow()などです。

didMoveToWindow()などのイベントは画面表示処理の場合に複数回呼ばれることがあります。

またdrawRect:やlayoutSubviews()は画面遷移後やバックグラウンドからの復帰時には呼ばれません。

これらの制約は、画面に表示されたときにUIViewにアニメーションを付与したい場合に困りました。

UIViewにoptionsでrepeatを設定したアニメーションを付与したとしても、画面遷移やバックグラウンドへ遷移が発生したときには止まってしまいます。

画面遷移から戻ってきた場合は、layoutSubviews()やdidMoveToWindow()イベントでなんとか再度アニメーションを付与することはできます。

しかし、バックグランドから復帰した時に再度アニメーションを付与することが困難です。

UIViewだけではバックグランドからの復帰イベントを知ることができません。

それらの責務はUIViewControllerが担っているということなのでしょう。

結果として、UIViewControllerからアニメーションを追加させるか通知で伝える方法しかわかりませんでした。