IOS 6 方向 - 只有一个 Viewcontroller 支持横向和纵向方向 - 否则只支持纵向

Posted

技术标签:

【中文标题】IOS 6 方向 - 只有一个 Viewcontroller 支持横向和纵向方向 - 否则只支持纵向【英文标题】:IOS 6 Orientations - Only One Viewcontroller supports Landscape & Portrait orientation - else ONLY Portrait 【发布时间】:2013-06-07 16:04:00 【问题描述】:

正如长标题所暗示的那样,我最近一直在为 ios 6 Orientations 苦苦挣扎。 我正在处理一个仅基于 iPhone 的当前项目,几乎所有的视图控制器都只支持纵向(默认方向)。 我有这个视图控制器虽然我想给多个方向作为唯一的一个,独立的。我该如何正确地做到这一点?这是我的方法。干杯'

在设置中 - 选择除纵向底部向上之外的所有方向。

在我想给出多个方向的 Viewcontroller 中 - 嵌入了此代码

-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskAllButUpsideDown;


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    return UIInterfaceOrientationPortrait;


-(BOOL)shouldAutorotate

    return YES;

对于其余的视图控制器 - 支持一种方向(默认方向)纵向:

-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationPortrait;


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    return UIInterfaceOrientationPortrait;


-(BOOL)shouldAutorotate

    return YES;

它不起作用。似乎没有调用方法 - 但项目和构建只是坚持设置中的选定方向。为什么这不起作用!

任何帮助将不胜感激。

【问题讨论】:

Supporting Multiple Interface Orientations 如果你想知道方法是否被调用然后NSLog(@"whateverMethodWasCalled in myViewController") 一点帮助都没有,你知道是否可以覆盖视图控制器中“设置”中设置的方向吗? 设置定义了您的应用支持的方向。您的视图控制器在supportedInterfaceOrientations 中说明了他们支持的内容。应用程序设置 (.plist) 和您在视图控制器的 supportedInterfaceOrientations 中定义的方向重叠的任何方向都是您的视图将自动旋转到的方向。 感谢@Unicorn 的回复,是的,我想知道我的 shouldautorotate & supportedInterfaceOrientations 中的方向方法是否被正确调用。 【参考方案1】:

您可以阅读:

Multiple Orientations

这就是我的工作:

在所有视图控制器中:

#pragma mark Orientation handling

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    
        return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
    

    -(BOOL)shouldAutorotate
    
        return YES;
    

    -(NSUInteger)supportedInterfaceOrientations
    
        return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
    

唯一的视图控制器:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
    return YES;

希望这会有所帮助..

【讨论】:

您将interfaceOrientationUIInterfaceOrientationUIInterfaceOrientationMaskAllButUpsideDown 进行比较,UIInterfaceOrientationMask。发现问题了吗? 感谢您的回复@lakesh 赞赏,但在 ios 6 及更高版本中不支持 shouldAutorotateToInterfaceOrientation 方法。虽然我会尝试代码并让你知道我发现了什么;) 如果你使用的是ios6及以上版本,请使用preferredInterfaceOrientationForPresentation【参考方案2】:

试试这个[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];,你需要在构建阶段为这个文件设置-fno-objc-arc

【讨论】:

私有 API,糟糕的主意。【参考方案3】:

-supportedInterfaceOrientations 应该返回一个掩码,在你的情况下:

- (NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskPortrait;

【讨论】:

【参考方案4】:

您需要为要纵向显示的视图创建一个UINavigationController 子类。从 iOS 6 开始,视图控制器仅查看父控制器或根控制器以进行旋转处理而不是视图控制器本身,您正在根据您的描述进行操作。

在导航控制器子类.m中:

// Older versions of iOS (deprecated) if supporting iOS < 5
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation    
return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);


// >iOS6
 - (BOOL)shouldAutorotate 
return YES;
 

 // >iOS6
 - (NSUInteger)supportedInterfaceOrientations 
return UIInterfaceOrientationMaskPortrait;

Allow autorotation on just one view controller

【讨论】:

以上是关于IOS 6 方向 - 只有一个 Viewcontroller 支持横向和纵向方向 - 否则只支持纵向的主要内容,如果未能解决你的问题,请参考以下文章

仅在ios 6的一个视图中启用横向方向

iOS 6 - 如何在方向改变时运行自定义代码

IOS 6强制设备方向为横向

如何在 iOS 6 中以编程方式获取设备的当前方向?

从您的应用程序内部调用地图以获取路线 - iOS 5 iOS 6

iOS 6 中的模态视图控制器强制横向方向