2013-10-05 34 views
0

我有一個UINavigationController,它的視圖嵌入到UIViewController中。當我旋轉設備時,NavigationController完美地收到了事件 didRotate事件。但是,在UINavigationController內的當前可見視圖控制器之前推送的任何UIViewController都不會收到旋轉事件。如何在UINavigationController中正確旋轉viewcontrollers?

這是問題: 雖然第二個viewController在navigationController中是可見的,但如果我旋轉設備,ViewController會根據旋轉更改其佈局。當我彈出視圖控制器返回到第一個視圖控制器時,第一個視圖控制器根據縱向佈局顯示自己,因爲它不會調用我對旋轉視圖的重新佈局方法。

我不想增加觀察員的旋轉變化,因爲它通常已正確地表現爲默認的旋轉方式通常被自動調用...

我能在這種情況下怎麼辦?

我已經通過手動調用了willRotate函數來完成它,但我不覺得這是好的。

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    UIInterfaceOrientation io=[[UIApplication sharedApplication] statusBarOrientation]; 

    [self willRotateToInterfaceOrientation:io duration:0.3]; 

    for(int i=0;i<self.childViewControllers.count;i++){ 
     [[self.childViewControllers objectAtIndex:i]willRotateToInterfaceOrientation:io duration:0.3]; 
    } 
} 

回答

0

我不認爲你需要任何輪換事件觀察員。但是,UINavigationController中的UIViewController實例需要通知佈局更改。

[yourParentViewController addChildViewController:yourNavigationController]; 

這將確保您的導航控制器得到通知,關於佈局的變化,並傳遞給它的所有視圖控制器這樣的信息:這個,如果你添加UINavigationController到視圖控制器層次自動發生。

然後,你可以簡單地做你的佈局UIViewControllerviewDidLayoutSubviews法(或者,如果你有一個子類的觀點,在其layoutSubviews方法

注:以上這種方法需要iOS 5或更高

+0

謝謝Andreas,我已經將navigationController添加到parentViewController中,它會在輪換髮生時得到通知,但只有通知導航控制器的可見viewController – frankish

+0

@frankish通知如何?我創建了一個複製您的案例的測試項目,並且自動佈局一直在工作完美(使用自動更正時sizingMasks或'UIView'的'layoutSubviews'方法)。 –

+0

當設備旋轉到橫向模式時,我會從屏幕底部向右上方移動一些按鈕。但是如果我在旋轉設備之前推動其他viewcontroller,旋轉之後,我通過彈出當前viewcontroller來回到前一個viewcontroller,並且我看到viewcontroller沒有將我的按鈕移動到右上角,因爲我在「willRotate」函數上手動執行該操作。但是如果我在視圖控制器可見的情況下做同樣的旋轉。一切都很完美。 – frankish

0

你提到的代碼是不正確的。我們不應該調用顯式調用委託方法。請在您想要自動旋轉功能的viewControllers中實現以下功能。您還可以通過對允許的方向進行檢查來根據您想要的方向限制旋轉。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
     return YES; 
} 
相關問題