如何在iOS 6中強制將UIViewController設置為縱向


Answers

對於iOS6來說,最好的方法是在Ray Wenderlich團隊的“iOS6 By Tutorials”中註明 - http://www.raywenderlich.com/並且比大多數情況下的UINavigationController的子類更好。

我使用的iOS6包含一個設置為初始視圖控制器的UINavigationController故事板。

//AppDelegate.m - 這種方法在iOS6之前是不可用的

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;

if(self.window.rootViewController){
    UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
    orientations = [presentedViewController supportedInterfaceOrientations];
}

return orientations;
}

//MyViewController.m - 返回每個UIViewController支持的方向

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}
Question

由於ShouldAutorotateToInterfaceOrientation在iOS 6中已被棄用,並且我使用它強制將某個特定視圖強制為顯示縱向 ,所以在iOS 6中執行此操作的正確方法是什麼? 這只適用於我的應用程序的一個區域,所有其他視圖都可以旋轉。




把它放在你不想旋轉的每個ViewController的.m文件中:

- (NSUInteger)supportedInterfaceOrientations
{
    //return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
    return UIInterfaceOrientationMaskPortrait;
}

請參閱developer.apple.com/library/ios/#featuredarticles/…了解更多信息。




所以當我只顯示肖像模式視圖時遇到了同樣的問題。 通常,我會創建一個UINavigationController ,將viewController設置為rootViewController ,然後將UINavigationController顯示為模式視圖。 但是對於iOS 6, viewController現在會要求navigationController支持其支持的接口方向(默認情況下,它現在全部用於iPad,除了iPhone之外,其他所有方面都是顛倒的)。

解決方案 :我必須UINavigationController並覆蓋自動旋轉方法。 有點跛腳。

- (BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}



我沒有自己測試,但是文檔聲明您現在可以重寫這些方法: supportedInterfaceOrientationspreferredInterfaceOrientationForPresentation

你可能可以實現你想要的只是在這些方法中設置你想要的方向。




只需進入project.plist,然後添加支持的界面方向,然後只添加肖像(底部主頁按鈕)和肖像(頂部主頁按鈕)。

您可以根據項目要求添加或刪除那裡的方向。

謝謝




對於Monotouch,你可以這樣做:

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
    {
    return UIInterfaceOrientationMask.LandscapeRight;
}

public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation()
    {
    return UIInterfaceOrientation.LandscapeRight;
}



我不同意@aprato的回答,因為UIViewController旋轉方法是在類別本身中聲明的,因此如果您在另一個類別中重寫,則會導致未定義的行為。 在UINavigationController(或UITabBarController)子類中重寫它們更安全

此外,這不包括您從橫向視圖中將/呈現/彈出到僅肖像VC或反之亦然的場景。 為了解決這個棘手的問題(Apple從未解決),您應該:

在iOS中<= 4和iOS> = 6:

UIViewController *vc = [[UIViewController alloc]init];
[self presentModalViewController:vc animated:NO];
[self dismissModalViewControllerAnimated:NO];
[vc release];

在iOS 5中:

UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *view = [window.subviews objectAtIndex:0];
[view removeFromSuperview];
[window addSubview:view];

這些將會強制UIKit重新評估您的所有shouldAutorotate,supportedInterfaceOrientations等。




我有一個使用UISplitViewController和UISegmentedController的相對複雜的通用應用程序,並且有幾個視圖必須在使用presentViewController Landscape中presentViewController 。 使用上面提出的方法,我能夠讓iPhone 5和iPhone 6工作得可以接受,但由於某些原因,iPad只是拒絕呈現為橫向。 最後,我找到了一個簡單的解決方案(經過幾個小時的閱讀和試驗和錯誤實施),適用於設備和ios 5&6。

步驟1)在控制器上,指定所需的方向(或多或少,如上所述)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    NSInteger mask = UIInterfaceOrientationMaskLandscape;
    return mask;

}

第2步)創建一個簡單的UINavigationController子類並實現以下方法

-(BOOL)shouldAutorotate {
        return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskLandscape;
}

步驟3)呈現您的viewController

vc = [[MyViewController alloc]init];
MyLandscapeNavigationController *myNavigationController = [[MyLandscapeNavigationController alloc] initWithRootViewController:vc];
[self myNavigationController animated:YES completion:nil];

希望這對某人有幫助。