web-dev-qa-db-ja.com

UIViewControllerをプッシュするためのカスタムアニメーション

ビューコントローラーをプッシュするときにカスタムアニメーションを表示したいと思います。「拡大」アニメーションのようなものを実現したいと思います。つまり、アニメーションの全画面表示中に[100,100 220,380].

どこから始めるべきか、それぞれドキュメント、チュートリアル、リンクはありますか? :)


わかった。次のコードでエキスパンドアニメーションを作成できます。

if ([coming.view superview] == nil)   
    [self.view addSubview:coming.view];
    coming.view.frame = CGRectMake(160,160,0,0);
    [UIView beginAnimations:@"frame" context:nil];
    [UIView setAnimationDuration:4];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [coming viewWillAppear:YES];
    [going viewWillAppear:YES];
    coming.view.frame = CGRectMake(0, 0, 320, 480);
    [going viewDidDisappear:YES];
    [coming viewDidAppear:YES];
    [UIView commitAnimations];

私のビューは適切に表示されますが、残念ながらナビゲーションバーは更新されません。手動でそれを行う方法はありますか?


サンプルコードでは、ビューの変換を更新する関数がすべて0.03秒呼び出されます。残念ながら、UIViewControllerをプッシュすると、ビューのフレームのサイズを変更できません...私ですか?

55
Erik

できることは、次のように次のView Controllerをプッシュしますが、アニメーション化しないことです。

_[self.navigationController pushViewController:nextController animated:NO];
_

...そして、プッシュされているView Controllerで、CoreAnimationを使用してビューのカスタムアニメーションを作成できます。これは、viewDidAppear:(BOOL)animatedメソッドで行うのが最適です。

Core Animation Guide で実際にアニメーションを行う方法を確認してください。特に暗黙のアニメーションを見てください。

EDIT:更新されたリンク

25
imnk

次の関数(UINavigationControllerに追加)を使用して、プッシュアニメーションをカスタマイズします。

- (void) pushController: (UIViewController*) controller
         withTransition: (UIViewAnimationTransition) transition
{
    [UIView beginAnimations:nil context:NULL];
    [self pushViewController:controller animated:NO];
    [UIView setAnimationDuration:.5];
    [UIView setAnimationBeginsFromCurrentState:YES];        
    [UIView setAnimationTransition:transition forView:self.view cache:YES];
    [UIView commitAnimations];
}

このコードを適用して、好きなアニメーションを実行できると思います。

53
zoul

あなたが探しているコード:

    [UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.80];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[UIView setAnimationTransition:
 UIViewAnimationTransitionFlipFromRight
                       forView:self.navigationController.view cache:NO];


[self.navigationController pushViewController:menu animated:YES];
[UIView commitAnimations];
34
fyasar

ハインリッヒ、

FacebookのiPhoneアプリのように、ビューを拡大または縮小する方法を示すYouTubeチュートリアルを作成しました。

それが助けになることを願っています: iPhone SDKでビューを拡大/縮小する方法

アダム

10
Adam

@zoul:それはうまくいきました! 「self」を「self.navigationController」に、「self.view」を「self.navigationController.view」に変更しただけです。それが必要かどうかはわかりませんが、うまくいきました。 @craftermは、ポップバックに関しては、viewDidLoadまたはViewWillAppearに次のコードを追加して、独自のleftBarButtonItemを作成します。

//add your own left bar button
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)];
self.navigationItem.leftBarButtonItem = backButton;
[backButton release];

次に、Push関数を微調整し、-backButtonTappedメソッドで呼び出したこのpopWithTransition関数を作成しました。

- (void) popWithTransition: (UIViewAnimationTransition) transition
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.75];
    [UIView setAnimationBeginsFromCurrentState:YES];        
    [UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES];
    [UIView commitAnimations];
[self.navigationController popViewControllerAnimated:NO];
}

アニメーションの後、popViewController呼び出しが最後まで下に移動していることに注意してください。それがコーシャかどうかはわかりませんが、繰り返しますが、うまくいきました。

7
David

ADTransitionController をご覧ください。これは、Applidiumで作成したカスタム遷移アニメーション(そのAPIはUINavigationControllerのAPIと一致します)によるUINavigationControllerの置き換えです。

Pushおよびpopアクションに異なる事前定義されたアニメーションを使用できますasSwipeFadeCubeカルーセルなど。あなたの場合、あなたが要求しているアニメーションはZoomと呼ばれるものです。

3
felginep

必要なのは、 iphone developer cookbook の第2章のダウンロードです。 affineRotateサンプルを特に見てください。ただし、コアアニマチンサンプルのいずれかが役立ちます。

3
ennuikiller