8

UINavigationControllerカスタムアニメーションでViewControllerをプッシュするための拡張機能として、次のコードを使用します。

@implementation UINavigationController (PushAnimation)

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

@end

キャッシュを有効にすると、を押すと奇妙なアニメーション動作が発生しUITableViewControllerます。カスタムアニメーションが完了すると、プッシュされたビューのタイトルが表示されます。トランジションスタイルUIViewAnimationTransitionNoneを使用すると、タイトル自体がアニメーション化されていることが明らかになります。画面の左上隅から中央に移動しUINavigationBarます。

キャッシュを無効にすると、このアニメーションは速度が原因で表示されませんが、フレームレートが大幅に低下します。

タイトルがアニメーション化されないようにするにはどうすればよいですか?

4

3 に答える 3

0

このコードを使用して、非常に簡単な方法でナビゲーション遷移アニメーションをカスタマイズします。

CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionMoveIn; //kCATransitionPush; //kCATransitionReveal; //kCATransitionFade; 
//transition.subtype = kCATransitionFromRight; //transition.subtype = kCATransitionFromLeft; //transition.subtype = kCATransitionFromTop; //transition.subtype = kCATransitionFromBottom;
transition.subtype = kCATransitionFromRight;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[[self navigationController] popViewControllerAnimated:NO];

プッシュについても同じです。

**必ず#import <QuartzCore/QuartzCore.h> クラスに追加し、フレームワークをプロジェクトに追加してください

target > Build Phases > Link Binary With Libraries > 「+」ボタン > QuartzCore.framework

.**

于 2012-06-06T13:20:40.353 に答える
0

私の修正が最終的に何であったかを簡単に更新します。UINavigationBariOS はプライベート API を使用してアニメーションを実装しているため、 のデフォルトの動作をオーバーライドすることはできませんでした。UINavigationBarそのため、次のコードを使用して、 とそのさまざまなサブビューのすべてのアニメーションを削除することになりました。

[self.navigationBar.layer removeAllAnimations];
for (UIView *view in self.navigationBar.subviews) {
    [view.layer removeAllAnimations];
    for (UIView *sub in view.subviews) {
        [sub.layer removeAllAnimations];
    }
}

これが の後に呼び出されることが重要です[self pushViewController:controller animated:NO];

于 2012-07-22T14:11:02.737 に答える
0

問題は、ビュー全体をアニメーション化self.viewしていることです。self.viewには、View Controller と が含まれていUINavigationBarます。したがって、おそらくすべてのサブビューを取得してから、View Controllerself.viewに関連するものだけをアニメーション化する必要がありviewます。

于 2012-06-01T02:33:55.427 に答える