4439


現在アニメーションに関する実装をしており、フェードインしながら画像が切り替わるアニメーションがスタートし、数秒経った後にフェードアウトしてアニメーションが終了するという処理をしようとしているのですが、アニメーションの設定を無限リピートにしており、フェードアウト後にもう一度アニメーションがスタートしてしまいます。なので、フェードアウトした後に画像を画面から消そうとしているのですが、それがうまくいきません。下記のように実装してもアニメーションがスタートした段階で`completion:^(BOOL
finished){`以下が呼ばれてしまいます。

[code]

    [UIView animateWithDuration:0.5f
                              delay:0.5f
                            options:UIViewAnimationOptionCurveEaseIn
                         animations:^{
                             [self imageFade:_imageView fadeIn:0 fadeOut:1 delay:0];
                             _imageView.animationImages = imageList;
                             _imageView.animationDuration = _duration;
                             _imageView.animationRepeatCount = 0;
                             [_imageView startAnimating];
                         } completion:^(BOOL finished){
                             [_imageView removeFromSuperview];
                         }];
    
[/code]

アニメーションの終了を検知するにはどうすればよろしいでしょうか？  
ちなみにanimationsブロックにあるimageFadeメソッドは以下のようになっており、フェードインとフェードアウトを開始する時間をし、フェードアウトが終わればimageviewをviewから削除するという処理を行っています。

[code]

    - (void)imageFade:(UIImageView *)imageView fadeIn:(int)fadeIn fadeOut:(int)fadeOut delay:(int)delay
    {
        imageView.alpha = fadeIn;
        [UIView animateWithDuration:1 delay:delay options:UIViewAnimationOptionCurveEaseIn
                         animations:^{ imageView.alpha = fadeOut;}
                         completion:^(BOOL finished){
                             [self imageFade:_imageView fadeIn:1 fadeOut:0 delay:_fadeDelay];
                             dispatch_after(dispatch_time(DISPATCH_TIME_NOW, _finishDelay * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
                                 [_imageView removeFromSuperview];
                             });
                         }];
    }
    
[/code]


CC BY-SA 3.0
2015-01-08T05:58:17.677
4271
2015-01-12T11:45:51.610
2015-01-12T10:53:31.763
5210
5210
question
ios objective-c
アニメーション終了の検知方法


`[UIView
animateWithDuration:delay:options:animations:completion:]`は、animations:ブロックの中におけるUIViewのプロパティ`frame`,
`bounds`, `center`, `transform`, `alpha`,
`backgroundColor`の値の変更をアニメーションさせる機能ですので、  
そこで画像をセットしたりすると期待した通りにならないかと思います。

これらのプロパティの変更がひとつも含まれない場合は、ただ単にブロック内のコードが実行され、次いで完了ブロックが実行されます。このとき指定した秒数は無視されます。また、同じ値を入れても無効です。あなたのコードではアニメーション可能なプロパティの値の変更が含まれていないために秒数が無視され、完了プロックが即時実行されたように見えるのだと思います。

例えば以下のようにアルファ値だけ変えて試してみてはどうでしょうか。

[code]

    // この時点で_imageViewには画像が正しく表示されているものとします。
    
    // フェードアウト処理を行います。
    [UIView animateWithDuration:0.5f
                          delay:0.5f
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         _imageView.alpha = 0
                     } completion:^(BOOL finished){
                         [_imageView removeFromSuperview];
                     }];
    
[/code]


CC BY-SA 3.0
2015-01-08T07:32:21.430
4281
2015-01-08T14:23:45.057
2015-01-08T14:23:45.057
5605
4271
answer


`animations:` で渡しているブロックの内容が、このメソッド `[UIView
animateWithDuration:delay:options:animations:completion:]`
の想定しているものであれば、終了の検知方法は合っています。

ここで別のメソッドを呼んでいますが、このメソッドの内容が分からない限り、この方法で終了の検知ができるかは判断できません：

[code]

    [self imageFade:_imageView fadeIn:0 fadeOut:1 delay:0];
    
[/code]


CC BY-SA 3.0
2015-01-10T12:11:01.953
4373
2015-01-10T12:11:01.953
2299
4271
answer


`UIImageView`の`startAnimating`のタイミングを外に出して、後は単純にアルファ値を操作するアニメーションを書けば良いのではないでしょうか？

[code]

    self.imageView.animationImages = @[
      [UIImage imageNamed:@"1"],
      [UIImage imageNamed:@"2"]
    ]; 
    self.imageView.animationDuration = 1.f;
    self.imageView.animationRepeatCount = 0; // 無限
    [self.imageView startAnimating];
    
    self.imageView.alpha = 0.f;
    [UIView animateWithDuration:0.5f
                          delay:0.f
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         self.imageView.alpha = 1.f;
                     }
                     completion:^(BOOL finished) {
                         [UIView animateWithDuration:0.5f
                                               delay:3.f  // 画面に留めておきたい秒数を指定
                                             options:UIViewAnimationOptionCurveEaseInOut
                                          animations:^{
                                              self.imageView.alpha = 0.f;
                                          }
                                          completion:^(BOOL finished) {
                                              [self.imageView stopAnimating];
                                          }];
     }];
    
[/code]


CC BY-SA 3.0
2015-01-12T11:45:51.610
4439
2015-01-12T11:45:51.610
5337
4271
answer