2012-11-04 56 views
0

我的應用程序支持兩組viewControllers,那些應該在縱向上工作的人和那些應該在橫向上工作的人。iOS - viewController遏制和自動控制

從不同的方向呈現viewControllers導致錯誤的方向,所以有人建議我創建一個viewController包含主視圖控制器(使所有方向的所有視圖都是YES),並添加兩個viewControllers分支,一個用於肖像(帶有shouldAutorotate YES的肖像)和一個風景(與shouldAutorotate是風景)。我的問題是:這會工作嗎?我的意思是,每個分支上的每個viewController是否會旋轉到正確的方向?

另一個問題是這樣的:我的項目是基於單個視圖的Xcode模板。該模板創建一個RootViewController,作爲顯示應用何時啓動的RootViewController。我的問題是:要使遏制建議工作,我必須在容器viewController中轉換這個rootViewController,我必須將其擁有的所有代碼移動到另一個視圖控制器,並在應用程序啓動時顯示該代碼。我的意思是這樣的:

我今天

  • 的應用程序運行並顯示RootViewController的。讓我們打電話給這個vCA。

如果我chabge的RootViewController的是我的viewController都會有這樣的

  • 的應用程序運行和顯示的ContainerController是完全空的,有可能存在舊的VCA容器。

在我看來,一個愚蠢的解決方案,我的意思是,呈現containerController是空的,將調用vCA?

我該怎麼做?

謝謝。

回答

0

你的問題有點令人困惑,因爲你使用術語present,就像在一個模式化的ViewController中一樣,但是你也提到了包含會創建一個不同的解決方案。

這一切都取決於你的應用程序。如果ViewControllers的一個分支只有肖像,而另一個分支只有肖像,那麼使用遏制可能會很困難,因爲你在這兩者之間切換。方向調用從父對象傳遞給子對象,但只有在旋轉發生時纔會調用它們。因此,例如,您的手機處於肖像狀態,並且您正在查看人像VC,當您切換到風景VC時,它將以人像顯示,當您旋轉設備時,方向調用將使其轉爲風景,並防止其返回肖像。反過來也是如此。 有一個技巧強制設備遍歷每個ViewController的所有方向回調,從而強制輪換,但我不確定它是否適用於每個iOS版本。您可以從其超級視圖(窗口)中刪除rootViewController的視圖,並立即再次添加它,這將觸發方向回調。所以你可以在每次在ViewController之間切換時嘗試這樣做。

或者,您可以使用縱向VC作爲rootViewController,創建橫向ViewController並將其存儲在某個位置,以便它仍保留在內存中。當你需要顯示橫向ViewController時,你可以在rootViewController上以模態方式顯示它。如果您的自動旋轉方法設置正確,它將更改狀態欄的方向並以正確的方向顯示VC。當你解散它時,方向將返回到肖像。

編輯:

我沒有的Xcode在這裏,但我打了東西快速在記事本中。這應該工作,它會強制設備切換方向,在這種情況下沒有轉換。如果您想使用動畫,請查看_landscapeVC的modalTransitionStyle屬性。

// In AppDelegate.h 
PortraitViewController* _portraitVC; 
LandscapeViewController* _landscapeVC; 

// In AppDelegate.m 
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 
{ 
    _portraitVC = [[PortraitViewController alloc] init]; 
    _landscapeVC = [[LandscapeViewController alloc] init]; 

    self.window.rootViewController = _portraitVC; 
    [self.window makeKeyAndVisible]; 
} 

-(void)showLandscape 
{ 
    [_portraitVC presentViewController:_landscapeVC animated:NO completion:^{}]; 
    [UIApplication sharedApplication].statusBarOrientation = _landscapeVC.interfaceOrientation; 
} 

-(void)showPortrait 
{ 
    [_landscapeVC dismissViewControllerAnimated:NO completion:^{}]; 
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait; 
} 
+0

謝謝。我已經嘗試過,並且無法使其工作。如果你可以提供一些代碼,我很感激。謝謝。 – SpaceDog

+0

好的,我添加了一小段代碼。如果你需要像我想的那樣強制設備的方向,那麼使用模態ViewController就是更清晰的解決方案。 – David

+0

ahhh,你的意思是將它添加到代表?我從來沒有想過。謝謝。我一回家就會嘗試。 – SpaceDog