iOS6的:supportedInterfaceOrientations不工作(被调用,但仍然界面旋

2019-06-18 05:03发布

在我的应用我有多个意见,一些看法需要支持纵向和横向的,而其他的观点仅需要支持肖像。 因此,在项目总结,我都选择了所有的方向。

下面的代码努力之前iOS 6的给定视图控制器上禁用横向模式:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

由于shouldAutorotateToInterfaceOrientation在iOS6的不赞成我把它换成了上面:

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMask.Portrait;
}

这种方法被称为正确的看法出现时(我可以设置断点,以确保这一点),但仍然接口旋转为横向模式不管事实,我要回只肖像模式面具。 我究竟做错了什么?

看来,这是目前不可能建立有按次取向不同需求的应用程序。 它似乎只能坚守在项目总结中指定的方向。

Answer 1:

如果您正在使用一个UINavigationController作为根窗口控制器 ,这将是 shouldAutorotatesupportedInterfaceOrientations这将被调用。

同上,如果你正在使用的UITabBarController,等等。

所以,我们该做的是继承您的导航/的TabBar控制器,并覆盖其shouldAutorotatesupportedInterfaceOrientations方法。



Answer 2:

尝试在AppDelegate.m更改此代码

//   self.window.rootViewController = self.navigationController;

    [window setRootViewController:navigationController];

这是完整的答案

shouldAutorotateToInterfaceOrientation不会被调用在iOS 6中

XD



Answer 3:

在我来说,我有UINavigationController的和我的视图控制器内。 我不得不UINavigationController的子类,并以只支持肖像,添加这个方法:

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

所以在UINavigationController的子类,我需要检查什么方向由当前topViewController支持。

- (NSUInteger)supportedInterfaceOrientations
{
    return [[self topViewController] supportedInterfaceOrientations];
}


Answer 4:

有一件事我发现是,如果你有一个旧的应用程序,现在还在做

[window addSubView:viewcontroller.view];  //This is bad in so may ways but I see it all the time...

您将需要更新到:

[window setRootViewController:viewcontroller]; //since iOS 4

一旦你这样做的方向应该开始重新工作。



Answer 5:

为iOS6的最好的办法明确由雷Wenderlich队“iOS6的通过教程”指出- 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;
}


Answer 6:

正如其他人,如果你使用一个UINavigationController,并表示要自定义各种意见,你会想要子类的UINavigationController,并确保你有这两个组成部分:

@implementation CustomNavigationController

// -------------------------------------------------------------------------------
//  supportedInterfaceOrientations:
//  Overridden to return the supportedInterfaceOrientations of the view controller
//  at the top of the navigation stack.
//  By default, UIViewController (and thus, UINavigationController) always returns
//  UIInterfaceOrientationMaskAllButUpsideDown when the app is run on an iPhone.
// -------------------------------------------------------------------------------
- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations]; 
}

// -------------------------------------------------------------------------------
//  shouldAutorotate
//  Overridden to return the shouldAutorotate value of the view controller
//  at the top of the navigation stack.
//  By default, UIViewController (and thus, UINavigationController) always returns
//  YES when the app is run on an iPhone.
// -------------------------------------------------------------------------------
- (BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

然后,在这是一个纵向的任何视图只有你将包括:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

而在这一切却颠倒的任何观点:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}


Answer 7:

基本上有人如上所述,但在更多详细信息:

  1. 创建一个新的文件,是的UINavigationController的一个子类
  2. 转到您的故事板,然后点击导航控制器,它的类设置为您刚刚创建的
  3. 在这个类(.m文件)添加以下代码,以便它会留在人像模式:

     (BOOL)shouldAutorotate { return NO; } (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

这为我工作



Answer 8:

此代码为我工作:

-(BOOL)shouldAutorotate {
     return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

iPhone / iPad应用定位检查出我自己的答案



Answer 9:

我认为最好的办法是做一个分类,而不是继承UINavigationControllerUITabbarController

您的UINavigationController + Rotation.h

#import <UIKit/UIKit.h>

@interface UINavigationController (Rotation)

@end

您的UINavigationController + Rotation.m

#import "UINavigationController+Rotation.h"

@implementation UINavigationController (Rotation)

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}


@end

试着让你的所有控制器进口这一类,这工作就像一个魅力。 你甚至可以使控制器不转动,并且推动另一个控制器,将旋转。



Answer 10:

尝试添加shouldAutorotate方法



Answer 11:

首先,为了使只有你应该返回模式下您的应用程序的工作UIInterfaceOrientationMaskLandscape 。 如果你想保持唯一的肖像模式,你在做正确的事情。

只需添加UISupportedInterfaceOrientations在Info.plist中键并指定接口的方向看重你的应用打算继续。

此外,你应该从返回false shouldAutoRotate如果你想避免自动旋转完全。 不过,我建议你从这里返回true,并指定了正确的方向supportedInterfaceOrientations方法。



Answer 12:

我有同样的情况,你。 我知道你已经接受一个答案,但我想我反正再添一个。 这是我理解的旋转系统的新版本的工作方式。 根视图控制器是有史以来被称为唯一的视图控制器。 其理由,我认为,这是与子视图控制器是没有意义的,因为往往他们会仅仅停留在根视图控制器的框架内,无论如何旋转自己的看法。

那么,会发生什么情况。 第一shouldAutorotate称为根视图控制器上 。 如果NO则返回一切都停止。 如果YES则返回supportedInterfaceOrientations方法被调用。 如果接口取向在此方法无论从Info.plist中或应用程序委托全球支撑取向证实,那么该观点旋转。 旋转之前shouldAutomaticallyForwardRotationMethods方法进行查询。 如果YES (默认值),那么所有的孩子都会收到willdidRotateTo...方法以及父(他们又将其转发给自己的孩子)。

我的解决方案(直到有一个更雄辩的一个)是在查询的最后一个子视图控制器supportedInterfaceOrientations方法并返回其值。 这让我转动部分地区,而只保留他人肖像。 我知道这是脆弱的,但我没有看到另一种方式,不涉及与事件调用,回调等复杂的事情



Answer 13:

如果您使用UINavigationController ,你必须实现shouldAutorotatesupportedInterfaceOrientations在子类中UINavigationController

这些能够通过两个步骤来控制,如果shouldAutorotate返回YES然后有效supportedInterfaceOrientations 。 这是一个非常好的组合。

这个例子,我的主要观点是,除了肖像和CoverFlowView PreviewView。 该CoverFlowView转移到PreviewView,PreviewView要遵循CoverFlowCView的旋转。

@implementation MyNavigationController

-(BOOL)shouldAutorotate
{

if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"PreviewView")])

return NO;

else

return YES;

}



-(NSUInteger)supportedInterfaceOrientations

{

if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"CoverFlowView")])

return UIInterfaceOrientationMaskAllButUpsideDown;

else

return UIInterfaceOrientationMaskPortrait;

}

...

@end


Answer 14:

我的解决办法:子类UINavigationController并将其设置为window.rootViewController

层次结构的顶部视图-控制将采取定向,一些代码示例的控制: 子类的UINavigationController



Answer 15:

这些问题的答案在这里指出我在正确的方向,虽然我无法得到它,因为我使用的UITabBarController内UINavigationControllers的只是削减和粘贴工作。 所以,我在AppDelegate.m版本看起来是这样的,这将为一个的UITabBarController内UITabBarControllers,UINavigationControllers或UINavigationControllers工作。 如果使用的是其他定制遏制控制器,则需要在此处添加(这是怎样的一个令人失望的)。

- (UIViewController*)terminalViewController:(UIViewController*)viewController
{
  if ([viewController isKindOfClass:[UITabBarController class]])
  {
    viewController = [(UITabBarController*)viewController selectedViewController];
    viewController = [self terminalViewController:viewController];
  }
  else if ([viewController isKindOfClass:[UINavigationController class]])
  {
    viewController = [[(UINavigationController*)viewController viewControllers] lastObject];
  }

  return viewController;
}

- (NSUInteger)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
  NSUInteger orientations = UIInterfaceOrientationMaskPortrait;
  UIViewController* viewController = [self terminalViewController:window.rootViewController];

  if (viewController)
    orientations = [viewController supportedInterfaceOrientations];

  return orientations;
}

另外需要注意的关键问题是,你必须覆盖supportedInterfaceOrientations在UIViewController的子类,否则将默认在您的Info.plist指定什么。



文章来源: iOS6: supportedInterfaceOrientations not working (is invoked but the interface still rotates)