53

我想在推視圖控制器時顯示一個自定義動畫:我想實現類似於「展開」的動畫,這意味着新視圖從給定的矩形擴展,可以說[100,100 220,380]在動畫期間全屏顯示。推送一個UIViewController的自定義動畫

任何建議,從哪裏開始,分別是任何文檔,教程,鏈接? :)


好的。我可以使動畫擴展用下面的代碼:正確顯示

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時,我無法調整視圖的框架...我是嗎?

回答

25

你可以做的是推動下一個視圖控制器,但沒有設置動畫,就像這樣:

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

......然後,在所得到推在視圖控制器,你可以這樣做使用CoreAnimation進行視圖的自定義動畫。這可能最好在viewDidAppear:(BOOL)animated方法中完成。

請查看Core Animation Guide瞭解如何實際執行動畫。特別注意隱式動畫。

編輯:updated link

+3

我已經嘗試了這種方法,但問題在於,當您使用此推送時,第一個視圖控制器會在下一個控制器啓動動畫之前消失。應該發生的事情是:1)下一個視圖控制器動畫,其視圖完全覆蓋舊的vc視圖,然後彈出舊的vc。我正在編譯的iOS 4.3,這是行不通的。 – SpaceDog 2012-10-05 10:47:21

+1

這不可擴展。導航控制器應該處理動畫。這是一個黑客,你必須爲每個推送的視圖控制器實施。 – 2014-01-20 03:39:06

3

你想要的是iphone developers cookbook第2章的下載。雖然任何核心animatin樣本都會幫助您,但請特別注意affineRotate樣本。

+0

謝謝。我會解決它。 – Erik 2009-09-10 16:45:39

52

我使用下面的函數(加入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]; 
} 

我想你可以適應這個代碼做任何你想要的動畫。

+2

不錯的一個,你如何處理popViewController案例?從我所看到的,叩擊背部按鈕不會調用任何給定的目標/選擇器對即使你重載後退按鈕,並提供一個,這樣你就可以將它設置爲指向,其中包括動畫自定義彈出的方法? – crafterm 2010-07-25 08:35:36

+0

我記得有一段時間與自定義動畫戰鬥,然後去一些不那麼痛苦的解決方案。我不記得我最終使用的是什麼,但它可能類似於接受的答案(或者我簡單地放棄並使用了工廠轉換)。 – zoul 2010-07-26 10:45:33

+1

我在哪裏寫這個代碼? – ichanduu 2012-06-13 10:23:23

7

@zoul:這很棒!我只是改變了「self」到「self.navigationController」和「self.view」到「self.navigationController.view」不知道這是否是必要的,但它的工作。和@crafterm,作爲彈出回來,只是讓自己leftBarButtonItem通過增加viewDidLoad中或viewWillAppear中此代碼:

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

然後,我只是調整了推送功能和使這個popWithTransition功能,我在我的-backButtonTapped方法稱爲。

- (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調用在動畫之後向下移動到最後。不知道這是否猶太教,但它再次運作。

10

海因裏希,

我已經做了YouTube的教程顯示如何讓意見膨脹和收縮,就像在Facebook的iPhone應用程序。

希望能有所幫助:How to make expanding/shrinking views on iPhone SDK

亞當

+0

好一個非常有用的同我 – harshalb 2010-10-20 05:08:57

+0

@Adam,所以我一直在向你學習iPad應用程序的教程。我注意到橫向模式下的動畫中心不正確。在橫向模式下必須做些什麼來確保動畫看起來正確?我需要告訴動畫的起始邊界應該在哪裏。 – topwik 2013-06-27 19:45:48

34

您正在尋找的代碼:

[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]; 
+0

如何處理popViewController方案? – Ans 2014-04-23 11:13:19

3

看一看ADTransitionController,在更換下降爲UINavigationController的自定義在Applidium創建的過渡動畫(其API與UINavigationController的API匹配)。

您可以使用不同的預先定義動畫爲流行行動,如刷卡淡出立方卡魯塞爾等。在你的情況下,你正在請求的動畫是一個叫做縮放