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]; }