Objective C ViewController意外旋转到Landscape

时间:2014-04-09 22:05:02

标签: ios objective-c orientation uiinterfaceorientation portrait

我对视图有一些问题,我只想允许纵向视图。这是我的代码:

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

这很有效,直到另一个视图呈现在此视图上。当下一个视图控制器被解除时,第一个视图控制器似乎忽略了shouldAutorotate,它意外地进入了横向和纵向。我该如何解决这个问题?

编辑:请注意我正在使用其他使用横向的视图控制器。

4 个答案:

答案 0 :(得分:1)

如果您使用的是最新版本的XCode。只需转到Project Target - >部署信息 - >设备方向并简单地检查肖像并取消选中其余部分:)

答案 1 :(得分:0)

我的解决方案有点hacky,但它确实有效。如果其他人有更好的事情请告诉我。

首先,我选择了我的项目并选择了目标,然后我进入了General - >像@Bejibun这样的部署信息建议。除了肖像,我取消了一切。

然后我添加了以下代码:

AppDelegate.h:

#import "ViewControllerClass.h"

AppDelegate.m:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if ([[[[window.rootViewController presentedViewController] presentedViewController] presentedViewController] isKindOfClass:[ViewControllerClass class]] && ![[[[window.rootViewController presentedViewController] presentedViewController] presentedViewController] presentedViewController])
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

这个

  

[[[[window.rootViewController presentsViewController]   presentsViewController] presentsViewController]   isKindOfClass:[ViewControllerClass class]]

告诉我,根视图控制器的下一个视图控制器的下一个视图控制器是否是我想要只有纵向视图的类类型。这是应该总是呈现的方式,但这是我希望有一些方法返回最底层的视图控制器所以我不必做[[presentViewController] presentsViewController]等...

  

![[[[window.rootViewController presentsViewController]   presentsViewController] presentsViewController]   presentedViewController]

允许我确保没有其他视图控制器,因为我可能在这个应用程序中有更多的视图控制器。

答案 2 :(得分:0)

  1. 最好使用UINavigationController在viewcontrollers之间导航然后呈现它们。
  2. 要强制以不同方向呈现视图控制器,您应该继承UINavigationController并将代码添加到它的子类中(将强制导航控制器使用顶视图控制器的方向):

    -(BOOL)shouldAutorotate
    {
        return [[self topViewController] shouldAutorotate];
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
        return [[self topViewController] supportedInterfaceOrientations];
    }
    
    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return [[self topViewController] preferredInterfaceOrientationForPresentation];
    }
    

答案 3 :(得分:0)

在顶级横向视图控制器解除之前,向AppDelegate发送通知,设置变量allowViewToRotate = NO,

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window NS_AVAILABLE_IOS(6_0)
{
if(self.allowViewToRotate)
{
    return UIInterfaceOrientationMaskAll;
}
else
{
    return UIInterfaceOrientationMaskPortrait;
}
}

这适用于我,在顶级风景视图控制器被解雇后,屏幕上的下一个控制器仍然保留了肖像。