8

我用下面的代碼作爲擴展UINavigationController推帶有自定義動畫視圖控制器:推自定義動畫一個UITableViewController總是動畫UINavigationItem標題

@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的中心。

禁用緩存功能後,該動畫由於其速度而不可見,但幀速率明顯下降。

如何防止標題被動畫?

+1

我認爲標題的動畫發生在'UINavigationBar'代碼中。一個想法是將其子類化,並改變它的默認行爲 – adig

回答

0

只是快速更新我的修復程序到底是什麼。由於iOS使用私有API來實現動畫,因此無法覆蓋UINavigationBar的默認行爲。所以,我結束了在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];後調用。

0

問題是你是動畫全景self.viewself.view包含視圖控制器以及UINavigationBar。因此,您可能必須獲取self.view的所有子視圖,然後僅對與您的視圖控制器有關的view生成動畫。

+0

嗯,我也想動畫導航欄,因爲我想讓整個屏幕改變,而不僅僅是UINavigationBar下面的內容。問題是,我似乎無法禁用UINavigationbar的默認導航。 –

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> 在你的班級,並添加框架到您的項目

目標>構建階段>鏈接二進制與圖書館>的「+」按鈕> QuartzCore.framework

。**