如果您打算啓用或禁用所有視圖控制器的旋轉,則不需要子類UINavigationController
。 而是使用:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
在AppDelegate
。
如果您計劃,以支持父視圖控制器應用中的所有方向,但不同的方向(UINavigationController
棧爲例),你應該結合使用
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
從AppDelegate
在你的父視圖控制器下面的方法。
- (BOOL)shouldAutorotate
和
- (NSUInteger)supportedInterfaceOrientations
但是,如果你打算在同一個導航堆棧中不同的孩子ViewControllers不同的方向設置(比如我),你需要檢查當前的ViewController導航堆棧。
我創建了一個我UINavigationController
子類中的以下內容:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
int interfaceOrientation = 0;
if (self.viewControllers.count > 0)
{
DLog(@"%@", self.viewControllers);
for (id viewController in self.viewControllers)
{
if ([viewController isKindOfClass:([InitialUseViewController class])])
{
interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
else if ([viewController isKindOfClass:([MainViewController class])])
{
interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
else
{
interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
}
}
}
return interfaceOrientation;
}
因爲你不能從孩子ViewControllers你必須以某種方式攔截什麼視圖控制器是目前在導航堆棧呈現視圖控制器的旋轉設置了控制。所以這就是我所做的:)。希望有所幫助!
這幾乎爲我工作。問題是如果我已經在風景中,當我將標籤切換到肖像時,它仍然處於風景中。旋轉的肖像修復它,它不會旋轉回風景,但我仍然需要在第一次加載時使用肖像。 – Ryan
我不確定你需要做什麼來旋轉它,但我敢打賭你會在 - (void)viewWillLayoutSubviews中做到這一點。從內存中我可能不完全正確的方法名稱。我自己的看法,我使用這個代碼的地方,在旋轉時會完全改變,我使用該方法將它們重新配置回肖像模式。你也可以在-viewWillDisappear中嘗試一些東西。也許[self.view setNeedsDisplay]。我目前不在Xcode,所以這些只是我想要探討的想法。 –
不錯!奇蹟般有效!幾乎我所需要的幾乎是 – Dennso