2011-03-01 55 views
1

我是一個相對新手可可&編程的ipad。有關涉及多個視圖時的旋轉問題

我已經構建了一個具有分割視圖控制器的應用程序。在詳細視圖中是一個帶有按鈕的工具欄。按下按鈕時,分隔視圖控制器將從超級視圖中移除,並將其他視圖置於其位置。此新視圖上的工具欄按鈕會刪除視圖並將分割視圖重新放回。非常棒......除非在第二個視圖可見時旋轉ipad。當用戶返回到分割視圖時,它將顯示爲旋轉前的狀態。

將分割視圖和所有子視圖設置爲autoresize = yes,並在收到autorotatetointerfaceorientation消息時返回yes。

我猜我需要告訴拆分視圖及其子視圖來調整自己,當我把它作爲子視圖添加到窗口。

感謝 克里斯

+0

雖然我不確定如何解決您的問題,但我遇到了類似於您的問題。問題是,當一個視圖不在主窗口的視圖層次結構中時,它不會在設備旋轉時被告知旋轉。由於UISplitViewController在你被允許使用它的時候非常僵化,所以問題更加嚴重。我很確定它不是從視圖層次結構中刪除並重新添加的。可悲的是,當我想用​​UISplitViewController做比Apple更多的功能時,我不得不從頭構建我自己的版本。不好玩。 – 2011-03-01 04:10:15

+0

嗯。有沒有辦法將分割視圖控制器留在層次結構中但不可見?或者,除此之外,也許我可以在刪除拆分視圖之前獲取方向,與將要放回的方向進行比較,並在將子視圖添加回來之前告訴其旋轉自己? – Chris 2011-03-01 04:16:32

回答

0

請在這裏看到關於這個問題,我的問題:

Best way to switch between UISplitViewController and other view controllers?

如果使用UISplitViewController蘋果打算讓你來,這是相當有限的。

我完全按照您提到的方式使用策略 - 即從UIWindow中刪除UISplitViewController的視圖,並替換爲另一個視圖,然後再切換回來。我發現即使旋轉了視圖B(B是非分割視圖),然後切換回A(分割視圖),我也處理了方向改變WAS。但是,我不得不做一些擺脫uisplitview的幀大小以使其工作。稍後當我找到它時會更新。

還有寫你自己的拆分視圖控制器,或者使用別人的重新實施,比如這一個選項:

http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad

UPDATE

我與框架所做的擺弄UISplitView的大小可以在我的AppDelegate中的以下方法中看到。這些方法是通過一個UIWindow下更換另一個頂層視圖控制器呈現拆分視圖控制器:

- (void)removeAllWindowSubviews { 
    for (UIView *childView in window.subviews) { 
     [childView removeFromSuperview]; 
    } 
} 

- (void)presentSplitView:(UISplitViewController *)vc { 
    [self removeAllWindowSubviews]; 

    UIView *viewForSplitVC = vc.view; 

    // fix for deficiency in adding a split view controller's view in landscape mode 
    // and it still having a frame for portrait mode. 
    // 2010-10-15 added -20.0f to fix problem with toolbar in LHS VC being 20 pix too low. 
    viewForSplitVC.frame = CGRectMake(viewForSplitVC.frame.origin.x, viewForSplitVC.frame.origin.y, 
           navigationController.view.bounds.size.width, navigationController.view.bounds.size.height - 20.0f);  

    [window addSubview:viewForSplitVC]; 
} 

// for removing the split view and restoring the other main VC 
- (void)restoreMenu { 
    if (isIPad()) { 
     [self removeAllWindowSubviews]; 

     [window addSubview:navigationController.view];  
    } 
} 

正如我所說,這是一個黑客,但幀的修正給我提出分割VC沒有能力其框架有時不正確。正如我前面提到的,通過這樣做,我們不在蘋果希望我們做的事情之外,因此涉及到黑客行爲。

+0

另外,你用框架尺寸做了什麼調整,以使事情合適嗎?我已經看過Matt Gemmell的分割視圖實現。我希望避免必須走這條路。再次感謝。 – Chris 2011-03-02 03:11:26

+0

將更新我的答案與一些相關的代碼! – occulus 2011-03-02 11:34:19

+0

非常感謝。我不得不添加viewForSplitVC.transform = CGAffineTransformIdentity來讓它正常工作,但除此之外,這正是我所需要的。謝謝。 – Chris 2011-03-02 15:24:11

0

好吧,我有什麼可能的工作的想法:不要從視圖層次結構的UISplitViewController的看法。相反,要麼將視圖置於頂部,要將其視圖的alpha屬性設置爲0,或將其視圖的hidden屬性設置爲YES。

+0

將不起作用,因爲方向事件只發送到UIWindow的第一個子視圖。他將失去定向事件,以推向他所推崇的新觀點。 – occulus 2011-03-01 16:13:37

+0

@occulus - 是否有可能通過在分割視圖被換出之前查看應用程序的旋轉狀態來模擬旋轉,以及是否再次將分割視圖重新置入時可以模擬旋轉?我可以通知狀態的分割視圖,然後再將它帶回來,或者我可以將其重新插入,並立即僞造方向更改(通過傳遞事件?)以使其正確顯示。思考? – Chris 2011-03-02 03:10:13