2009-05-29 91 views
3

我有一個視圖,它有一個UIWebView和一個OptionsPane(具有自定義視圖的自定義UIViewController)。Iphone SDK - 動畫子視圖

我希望當顯示視圖時,對於選項窗格(位於主視圖的頂部)將FLIP放置到位。我正在使用該代碼,並且得到了一個奇怪的結果。

第一次顯示視圖時,選項窗格似乎已經可見...當我在我的navController上按BACK時,再次拉起視圖,動畫完美地工作。

任何人都可以對這個主題有所瞭解嗎?

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    optionsPane=[[OptionsPaneController alloc] initWithNibName:@"OptionsPane" bundle:nil]; 
} 

- (void)viewWillAppear:(BOOL)animated { 

    [optionsPane.view removeFromSuperview]; 
    [self checkOptionsVisible]; 
} 

-(void)checkOptionsVisible{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[optionsPane view] cache:YES]; 
    [[self view] addSubview:[optionsPane view]]; 
    [theWebView setFrame:CGRectMake(0,87,320,230)]; 
    [[optionsPane view] setFrame:CGRectMake(0,0,320,87)]; 
    [UIView commitAnimations];  
} 
+0

編者注。請不要更改OP發佈的問題的實際文本,除非對問題至關重要。通過編輯我的文本,你實際上改變了這個問題。保留你的標籤,回滾語言。 – Dutchie432 2012-10-22 10:52:12

回答

0

如果我理解你的解釋,那麼前一天我有一個非常類似的問題。

發生在第一次加載的是viewDidLoad首先觸發。加載nib文件比viewWillAppear需要更多的時間來激發自身。

我們得到的是在viewWillApper已經退役後的一個筆尖加載。

之後的任何負載,viewDidLoad不會觸發,讓viewWillAppear做其忠誠的翻轉工作。

怎麼辦?
首先,嘗試更改您的代碼以使用「viewDidAppear」。這應該有所幫助,但你必須看看它看起來不錯。

另一個選項(我知道的醜陋的一個)是在viewDidLoad上也調用了checkOptionsVisible。
如果沒有這種幫助,我會認爲計時器是一種黑客 - 如果需求允許的話。

我希望讓你更接近解決問題。

1

嗯,我不認爲viewWillAppear消息是第一次發送。我在SDK中讀到兩件事。你應該調用該消息裏面超級有可能適用於你的第一次大的警告:

警告:如果屬於視圖控制器的觀點是直接加入到一個視圖層次結構,視圖控制器不會收到此消息。如果向視圖層次結構中插入或添加視圖,並且它具有視圖控制器,則應直接將關聯的視圖控制器發送此消息。無法發送視圖控制器此消息將阻止顯示任何關聯的動畫。

最終,我會運行調試器,並確保viewWillAppear消息發送時,你認爲它是。

+0

非常有趣......我一定錯過了那個筆記。讓我玩弄一下,讓你知道故事是什麼,因爲我相信它被調用。 – Dutchie432 2009-05-29 17:33:46

+0

這是第一次射擊,好吧 - 以及隨後的所有時間。 – Dutchie432 2009-05-29 18:29:07

+0

無賴,我希望這會有所幫助 – 2009-05-29 19:32:37

0

更新您的具體情況:

而是有四個觀點:

  1. 襯背視圖

  2. 主視圖

  3. 後視圖(選項面板)100個像素

  4. 前視圖(空白視圖)100像素

正常地將主視圖添加到後備視圖。

將前視圖添加到希望顯示選項窗格的支持視圖中。

確保正面和背面視圖具有相同的框架。

使用方法翻轉正面和背面視圖使用相同的代碼。


原來的答案

您需要3次:

  1. 襯背視圖

  2. 前視圖

  3. 後視圖

支持視圖只是保持其他2來回翻轉下面是翻轉方法。我把它們放在backingViewController中:

- (void)displayBack{ 

    //parent controller is an ivar so the sub-view controllers know who their daddy is 
    backController.parentController = self; 


    [UIView beginAnimations:nil context:@"flipTransitionToBack"]; 
    [UIView setAnimationDuration:1.2]; 

    //note self.view IS the backing view 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; 

    //remove the front view 
    [[frontController view] removeFromSuperview]; 
    //add the back view view 
    [self.view addSubview:[backController view]]; 
    [UIView commitAnimations]; 

    //giving a heads up to the view that is about to come on screen 
    [backController viewWillAppear:YES]; 

} 



- (void)displayFront{ 

    [UIView beginAnimations:nil context:@"flipTransitionToFront"]; 
    [UIView setAnimationDuration:1.2]; 

    [UIView setAnimationDelegate:self]; 

    //I'm interested in knowing this has happened 
    [UIView setAnimationDidStopSelector:@selector(flipAnimationDidEndWithID:finished:context:)]; 

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; 
    //remove back view 
    [[backController view] removeFromSuperview]; 
    //add the front view 
    [self.view addSubview:[frontController view]]; 
    [UIView commitAnimations]; 

} 
+0

不同的是,我有兩個視圖同時顯示,一個大約100像素高,另一個高於另一個 - 我不在它們之間切換 - 我只是頂部以翻轉的方式觀看「出現」。 – Dutchie432 2009-06-03 15:47:49

0

UIViewController上的視圖屬性是懶惰加載的 - 即使當您在這裏初始化一個筆尖時,視圖本身也不會實例化,直到第一次訪問該屬性。

很難確切地知道發生了什麼,但沒有看到更多代碼,但是如果您訪問viewDidLoad中的optionsPane.view,則可能會得到所需的結果(您無需對其執行任何操作,只需訪問該屬性即可強制加載)。