2012-05-06 48 views
7

我最近遇到了一個問題,即將一些代碼從iPhone應用程序移植到iPad。這可能與here中描述的問題有關,但我發現該問題的解釋/解決方案不令人滿意。該方案是這樣的:在iPad上顯示多個視圖控制器和旋轉

  1. 視圖控制器「A」(根視圖控制器)提出了一個模式視圖控制器(稱之爲「B」)與「形表」模式的演講風格。

  2. 視圖控制器B以「全屏」模式呈現樣式呈現視圖控制器'C'。

  3. iPad旋轉,而視圖控制器C是最頂級的視圖控制器。

  4. 解散C後,B重新顯示,但方向不正確。

至於我可以告訴大家,不應該有多個呈現視圖控制器的鏈接的問題 - 事實上,這種行爲Presenting View Controllers from Other View Controllers文檔中明確支持。我還閱讀了iOS 5 Release Notes中的以下語句:

iOS 5中的旋轉回調不適用於全屏顯示的視圖控制器。這意味着如果您的代碼在另一個視圖控制器上顯示視圖控制器,然後用戶隨後將設備旋轉到不同的方向,則在解散時,底層控制器(即呈現控制器)將不會收到任何旋轉回調。但請注意,呈現控制器將在重新顯示時收到viewWillLayoutSubviews調用,並且可以從此方法查詢interfaceOrientation屬性並用於正確佈置控制器。

據我所知,這不會發生 - 視圖控制器B接聽電話時-shouldAutoRotateToInterfaceOrientation但值這一呼籲interfaceOrientation參數是視圖控制器B的接口的價值取向,當它呈現視圖控制器C,而不是解僱時C的界面方向的值。由於我們在iPad上,所有這些視圖控制器在-shouldAutoRotateToInterfaceOrientation中返回YES。因此B的視圖邊界永遠不會改變,所以-willLayoutSubviews永遠不會被調用。

我已經嘗試在B回調之前將視圖控制器C的方向保存在B中,然後在下次調用時使用該信息-shouldAutoRotateToInterfaceOrientation並僅在C被取消時返回YES。修復了這個失敗的UI,但未進行此檢查,但視圖控制器B未將其界面方向更新爲此值,因此後續模態演示將從設備的錯誤側進/出。

有沒有人能夠成功獲得這樣的視圖控制器配置工作?這似乎不是那種不尋常的情景,所以我有點驚訝,它不像我最初預期的那樣工作。

在此先感謝。

回答

0

在我看來,如果您不使用導航控制器,多個鏈式模態視圖控制器會導致令人困惑和惱人的用戶體驗。我認爲視圖控制器B應該位於導航控制器中(如果不需要,則不必顯示觸摸板欄)。

模態演示實際上應該是針對單個死角實體(包含多個子視圖控制器的單個視圖控制器或導航控制器)。

出於興趣,你是說這在iPhone上可以正常工作,但不在iPad上?還是你不允許iPhone版本的輪換?

我也發現this thread它說,從根視圖控制器呈現您的模態視圖控制器可能會有所幫助。

+0

我同意使用導航控制器作爲模式的根本不那麼容易混淆。然而,我試圖匹配的設計需要視圖控制器B的表單樣式和視圖控制器C的全屏演示。這似乎是實現期望結果的阻力最小的路徑,但不幸的是似乎有一些非顯而易見的問題。我實際上不確定在iPhone上是否存在這個相同的問題 - 您認爲手機上的旋轉被禁用是正確的。 – jamie

0

我曾經在iPhone上展示過多種模式視圖控制器。佈局沒有問題,除非我自己的代碼在處理多個方向時出現問題。當視圖控制器位於另一個視圖控制器後面時,實際上自動旋轉方法永遠不會被調用,所以我也會調整viewWillAppear上的佈局:以及。

在viewWillAppear中:, willRotateToInterfaceOrientation:時間:和didRotateToInterfaceOrientation :,根據需要我會調整佈局,以正確的方向,例如:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self switchToInterfaceOrientation:self.interfaceOrientation]; 
} 

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [super willRotateToInterfaceOrientation:interfaceOrientation duration:duration]; 
    [self switchToInterfaceOrientation:toInterfaceOrientation]; 
    // be careful, self.view.frame is still according to self.interfaceOrientation 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
    // self.view.frame is updated 
    // update something else here 
} 

- (void)switchToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // update your layout here 
} 

我不知道上面的代碼會怎樣在iPad上的視圖控制器上運行。由於它支持具有不同模式演示風格的視圖控制器,因此可能會有一些驚喜。