woshidan's loose leaf

ぼんやり勉強しています。

3.3 UIViewの問題について考えてみる

ここの問題を考えています。

問題

アニメーション完了後に画像を元に位置に戻るアニメーションを実装して下さい。(HINT:アニメーションブロックのネスト)

考えた事

アニメーション完了後ということはcompletionを使うのでしょうか。 元の位置に戻る、ということは、たとえば、元々移動の変位がsetFrameで指定されていたら、 completionブロックでも同じもの(UIView)にたいして、setFrameを逆の変位になるように指定するのでしょうか。

// コメントアウト部分が解答
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:1.5f
                          delay:0
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         [_ojisanImageView setFrame:kOjisanMovedFrame];
                     } completion:^(BOOL finished) {
                         // 実行後に何かアクションをする際はここに記述する
//                         [UIView animateWithDuration:1.5f animations:^{
//                             [_ojisanImageView setFrame:kOjisanInitialFrame];
//                         }];
                     }];

}

逆の位置になるような変位ではありませんね。 アニメーション前の画像の位置が(0,0)でアニメーション後が(150,416)なので、 completionブロック内のアニメーション(UIImageView#setFrame)で、imageViewを(0,0)(アニメーション前の位置)にsetFrameで移動させていました。

animations(アニメーションブロック)の中で、imageViewの表示/非表示を切り替えることもできます。

-(void)viewDidAppear:(BOOL)animated
{
    [UIView transitionWithView:self.view
                      duration:3.0
                       options:UIViewAnimationOptionTransitionCurlUp
                    animations:^{
                        _ojisanImageView1.hidden = YES;
                        _ojisanImageView2.hidden = NO;
                    } completion:nil];
}

アニメーションブロックの代わりに、- beginAnimations:context- commitAnimationsメソッドで挟む事で アニメーションのカタマリを作れます。

- (void)showHideDidStop:(NSString *)animationID finished:(NSNumber *)finished
                context:(void *)context
{
    [UIView beginAnimations:@"ShowOjisanView" context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelay:1.0];
    _ojisanImageView.alpha = 1.0;
    [UIView commitAnimations];
}