2010-06-07 65 views
2

我正在創建一個iPad應用程序,該應用程序只能在肖像和portait顛倒模式下工作。出於性能方面的原因,在我的applicationDidFinishLaunching方法中,我創建了幾個viewControllers,並將它們作爲子視圖添加到我的主窗口中。然後我隱藏了我不想馬上看到的那些。沒有標籤欄或導航控制器。Autorotation和多視圖控制器

我的問題是,只有第一個viewController似乎正在接收旋轉調用。我通過交換添加子視圖到主窗口和NSLog的順序來驗證這一點。有什麼方法可以強制所有控制器接收呼叫嗎?

我的一些觀點被設計成放在另一個視圖的頂部,但這個視圖背後並不總是相同的 - 所以在獨立的視圖控制器中使用重疊視圖似乎是有意義的。我在做一些根本性錯誤的事情,這就是爲什麼它不像我所期望的那樣行事?

編輯:對於這個問題,接受的答案似乎表明我面對確切的問題:UIViewController rotate methods

編輯2:確認只有「主」視圖控制器將獲得旋轉事件的另一個問題。我是否真的需要將所有代碼放到一個具有多個視圖的視圖控制器中? Multiple view controllers on screen at once?

回答

5

對於未來遇到此問題的人,我通過將項目移出應用程序委託並將其移入單個視圖控制器來解決此問題。該視圖控制器包含所有相關的子視圖控制器。通過僅將主視圖控制器作爲應用程序委託窗口的直接子視圖,自動轉回按預期工作。

+1

如果你有一個模式化的視圖控制器,你的根視圖控制器將不會得到旋轉事件... iphone應該注意... – jjxtra 2012-03-15 17:37:14

+0

@ alku83你是什麼意思「此視圖控制器然後包含所有相關的子視圖控制器「。 ? – cyrilchampier 2012-08-17 16:31:21

+0

這是一段時間以前,但我可能意味着不要將多個視圖控制器添加到MainWindow。相反,添加一個視圖控制器,然後根據需要託管您的其他子視圖控制器。 – 2012-08-21 06:53:43

1

還有另一種解決方案,具體取決於您的設計方案。 我有一個類似的問題,我需要交換覆蓋視圖控制器,這兩個都必須支持自動旋轉。

解決方案非常簡單。只需將控制器放在不同的窗口對象下。

所有UIWindow對象都會接收設備方向事件並將它們傳播到它們的子視圖控制器。

所以,最後我剛剛結束了交換UIWindow(s),它完美的工作。

+0

這只是保存了我的培根。謝謝! – jsd 2011-07-08 21:39:41

2

在AppDelegate中必須使用

[self.window setRootViewController:_controller]; 

代替

[self.window addSubview:_controller.view]; 

和控制器必須重寫方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 
0

我就遇到了這個頁面尋找一種方式來解決這個問題一個iPad應用程序,我只想分享我所做的工作來解決這個問題。

我把下面的代碼我MainViewController內(這是我rootController):

-(void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration { 
    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
      // My app has a toolbar, use CGRectMake(0, 0, 1024.0, 768.0) if your's doesn't 
      self.view.frame = CGRectMake(0, 20, 1024.0, 748.0); 
      break; 

     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationPortraitUpsideDown: 
      self.view.frame = CGRectMake(0, 20, 768.0, 1004.0);    
      break; 

     default: 
      break; 
    } 
} 

這樣做了以後,我的成分進行重新定位,按照自動調整大小設置,我把在Interface Builder。