NSTimerでアニメーション


一週間以上アニメーションのことで悩んでいました。

UIImageViewを画面を表示している間ずっと点滅させたい、やりたかったのはただこれだけなのですが。

ちょっと調べて最初に書いたコードはこんな感じ。

[UIView animateWithDuration:1.0
  delay:0.0
  options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
  animations:^{ flashIV.alpha = 0.0; }
  completion:nil
];

flashIVの透明度を1秒かけて1→0へ。その後UIViewAnimationOptionAutoreverseの効果で透明度は再び1秒かけて0→1へ戻る。
UIViewAnimationOptionRepeatを指定しているので、これが延々と繰り返すというもの。

これはこれでちゃんと動いていたのですが、ちょっと問題が。

ホームボタンでバックグラウンドに移行して復帰すると点滅が止まっている

実機でテストできる環境が整っていないのでシミュレータで確認しただけなのですが、バックグラウンドから復帰すると点滅が止まってしまっていて画像が消えてしまっていました。
バックグラウンドから復帰するときに何かしらの復帰作業をしてやらないといけないのかと思いましたが、google先生に聞いてみてもわざわざそんなことをしている人が見つからない。でも実際に公開されているアプリは、バックグラウンドから復帰してもアニメーションが継続されています。
これはどうやっているのか。

しばらく調べてみて、ようやく一つの解にたどり着きました。

それは、NSTimerで決まった時間毎にアニメーションを動かしてやること。
次のような感じにするとだいたい同じ見た目で、バックグラウンドから復帰してもアニメーションが続きます。

タイマーで2秒毎にonTimerメソッドを起動する

- (void)viewWillAppear:(BOOL)animated
{timer = [NSTimer scheduledTimerWithTimeInterval:2.0
    target:self
    selector:@selector(onTimer)
    userInfo:nil
    repeats:YES];
}

onTimerメソッドの中で透明度1→0, 0→1のアニメーションを動かす

- (void)onTimer{
[UIView animateWithDuration:1.0
  delay:0.0
  options:UIViewAnimationCurveEaseInOut
  animations:^{
    flashIV.alpha = 0.0;
  }
  completion:^(BOOL finished){
    [UIView animateWithDuration:1.0
      delay:0.0
      options:UIViewAnimationCurveEaseInOut
      animations:^{
        adminImageView.alpha = 1.0;
      }
      completion:nil];}
];
}

このままだと他の画面に移動した後もタイマーが動き続けるので、viewWillDisappearでタイマーを止めてやります。

- (void)viewWillDisappear:(BOOL)animated{
  [timer invalidate];
  timer = nil;
}

completionでわざわざ透明度を0→1に戻してるのがなんかかっこ悪いです。
こちらでもUIViewAnimationOptionAutoreverseを指定したら自動で戻ってくれると思ったのですがきれいに動きませんでした。

もっとよい方法が見つかるまでは、延々繰り返す系のアニメーションは当面こんな感じで実装していこうと思います。

コメントを残す

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