2010-02-24 102 views
2

我有一個UINavigationController有一個可見的導航欄和工具欄。當推動一個控制器(同一個控制器)時,我只想動畫內容部分(例如滑動效果),並保持NavigationBar和Toolbar不動畫/常量。任何人都可以提供任何建議乾淨的方式做到這一點?謝謝。UINavigationController自定義過渡動畫

回答

1

我手動移動的看法和使用動畫塊它們的動畫:

// Get position of old view controller 
CGPoint center = [oldViewController.view center]; 

// Position new view controller to the right of old one 
[newViewController.view setCenter:CGPointMake(center.x + 320, center.y)]; 

// Animate change 
[UIView beginAnimations:@"myAnimation" context:NULL]; 

// Move old view off screen 
[oldViewController.view setCenter:CGPointMake(center.x - 320, center.y)]; 

// Move new view onto screen 
[newViewController.view setCenter:center]; 

// Set animation delegate to self so that we can detect when animation is complete 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationComplete:finished:target:)]; 

// Finish animation block 
[UIView commitAnimations]; 

如果您需要使用您需要導航控制器實際推新的ViewController確保您的動畫之後做到這一點已完成,否則舊視圖將不會顯示。爲此,您需要使用setAnimationDelegate方法來獲取動畫完成時間和傳入選擇器方法的通知。在同一類中實現上述代碼和以下方法:

(void)animationComplete:(NSString *)animationId 
       finished:(BOOL)finished 
       target:(UIView *)target 
{ 
    if([animationId isEqualToString:@"myAnimation"]) 
    { 
    // Push viewcontroller here 
    } 
} 
+0

Thx。它幾乎可以工作,除了oldViewController視圖在被推入後消失。當動畫發生時,舊視圖只是一種黑色。你知道如何在推送之後保持oldViewController.view可見嗎?這是我添加來設置oldViewController和newViewController的代碼。 \t CGPoint center = [self.view center]; \t UIViewController * oldViewController = [self.navigationController topViewController]; NewController * newViewController = [[[NewController alloc] init] autorelease]; [self.navigationController pushViewController:newViewController animated:NO]; – JStay 2010-02-25 02:11:38

+0

在推入新視圖控制器之前,您需要結束動畫塊。也就是說,在[self.navigationController pushViewController:newViewController animated:NO]之前調用[UIView commitAnimations] – pheelicks 2010-02-25 09:09:53

+0

感謝您的迴應。在提交之後,我將push移動到了,並且它仍然產生與新視圖轉換爲黑/空視圖相同的結果。我在沒有推送的情況下嘗試了代碼,看看舊視圖是否轉換出來,並且它可以工作,但是一旦我介紹推送,它就會消失。 – JStay 2010-02-25 09:54:28

1

嘗試將工具欄作爲子視圖添加到窗口而不是視圖。並限制導航控制器的視圖高度,以便它可以看到你的工具欄。現在,如果您推動視圖控制器,則導航欄和工具欄將保持無生氣/停滯狀態。

+0

我想這樣做,但它似乎是一個很大的破解。我會試一試,然後回覆。謝謝! – JStay 2010-02-26 07:15:48

+0

我試過這個,大部分都適用。我調整了導航控制器高度的第一次嘗試,但是當我推動一個模態控制器並解散它時,高度在解散時總是不正確地返回(只能改變viewDidAppear中的高度,這會讓我動盪的動畫過渡回來)。接下來,我沒有使用導航高度,只是疊加了添加到窗口的工具欄,但隨後我與模式控制器重疊UP UP b/c窗口中的工具欄位於更高層,然後導航欄繼續。不知道熱點解決這個動畫呢。想法? – JStay 2010-03-05 15:48:02

0

將新UIViewController的navigationItem設置爲與當前UIViewController相同。

newViewcontroller.navigationItem = self.navigationItem; 
[self.navigationController pushViewController:recallViewController animated:YES]; 
相關問題