16

确认!我终于在 iOS 5 中解决了我的标签栏旋转问题,但 iOS 6 和 xcode 似乎有问题......这就是我所拥有的:

目标应用摘要包括:支持的界面方向 - 纵向、左侧横向、右侧横向

App 中的每个 Single View 都有以下方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    return ((interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown) &&
            (interfaceOrientation != UIInterfaceOrientationLandscapeLeft) &&
            (interfaceOrientation != UIInterfaceOrientationLandscapeRight));
} else {
    return YES;
}
}

- (BOOL)shouldAutorotate
{
NSLog(@"am I called1?");
return NO;
}

-(NSUInteger)supportedInterfaceOrientations{
   NSLog(@"am I called?");
   return UIInterfaceOrientationMaskPortrait;
}

在不属于选项卡栏的视图中,旋转被阻止。在标签栏的所有视图(有 5 个)中,应用程序从不调用 ShouldAutorotate 并因此旋转。似乎supportedInterfaceOrientations 在视图加载时被调用一次,但在我在视图之间切换时不会出现,因为我得到了NSLog,但它似乎忽略了MaskPortrait 设置。

我必须在目标中启用景观,因为我有一个需要旋转的视频播放器视图(它这样做,很好)

这是 iOS 6 中的标签栏错误吗?我是否需要以不同的方式禁用视图的旋转?shouldautorotatetointerfaceorientation 在 ios 5 中效果很好

我已经有一段时间了

谢谢,扎克

4

8 回答 8

36

扎克,我遇到了同样的问题。这是因为您将 viewController 嵌入到 TabBar 控制器或 UINavigationController 中,并且对这些方法的调用发生在这些方法中,而不是您的普通视图(在 iOS6 中更改)。

我遇到了这个问题,因为我在所有具有导航到不同视图(注册过程、登录等)的模态视图上都展示了一个嵌入 UINavigationController 的 viewController。

我的简单解决方法是为包含这两种方法的 UINavigationController 创建一个 CATEGORY。我有 shouldAutorotate 无论如何都返回 NO,因为我不希望我的模态视图旋转。你的修复可能就是这么简单,试一试。希望能帮助到你。

我创建了一个类别并将其命名为 autoRotate 并选择了 UINavigationController 选项。M+H 文件如下。

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

-(BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

@end

...和类别.h:

#import <UIKit/UIKit.h>

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end
于 2012-09-21T07:37:52.623 回答
11

如果您像我一样有一个标签栏,您唯一需要做的就是将以下内容添加到您的委托 .m 文件中,

#import "AppDelegate.h"

//UITabBarController category to set the view rotations for ios 6
@implementation UITabBarController (Background)

-(BOOL)shouldAutorotate
{
    //I don't want to support auto rotate, but you can return any value you want here
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    //I want to only support portrait mode
    return UIInterfaceOrientationMaskPortrait;
}

@end


/////here starts the implementation of the app delegate which is gonna be whatever you currently have on your .m delegate

@implementation AppDelegate

// delegate methods and other stuff

@end
于 2012-10-31T22:05:43.670 回答
7

我还有一个问题,我需要一些视图来旋转,而另一些视图不需要几个导航控制器。我通过告诉 NavigationController 查看视图控制器来做到这一点。这就是我所做的。

我创建了一个名为 RootNavigationController 的 UINavigationController 类,并将该类指定为故事板中导航控制器的自定义类。在 RootNavigationController.m 我添加了以下方法;

- (BOOL)shouldAutorotate {

    return [self.visibleViewController shouldAutorotate];
}

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

在每个视图控制器 .m 文件中,我还添加了以下方法。

- (BOOL)shouldAutorotate {
    //return yes or no
}

- (NSUInteger)supportedInterfaceOrientations{
    //return supported orientation masks
}

这样做可以让我在其视图控制器中为每个视图设置方向。

无论如何都为我工作......</p>

于 2012-09-25T21:33:54.130 回答
7

我的情况是:

  • UITabBarController 有 2 项: 2 导航控制器
  • UINavigationController1 withRootView: ViewController1
  • UINavigationController2 withRootView:ViewController2。
  • 现在我想要 ViewController1 设置 shouldAutorotate:NO/maskPortrait 和 ViewController2 设置 shouldAutorotate/MaskAll。

所以我的实现:创建 UITabBarController 类别和 UINavigationCntroller 类别,如

UITabBarController+autoRotate.h

@interface UITabBarController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end

UITabBarController+autoRotate.m

#import "UITabBarController+autoRotate.h"

@implementation UITabBarController (autoRotate)

- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations];
}

@end

UINavigationController+autoRotate.h

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end

UINavigationController+autoRotate.m

@implementation UINavigationController (autoRotate)

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

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

@end

UIViewController1.m

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

UIViewController2.m

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

它就像一个魅力!

于 2013-06-18T06:22:16.020 回答
0

在我的例子中,我有一个嵌入在 UITabBarController 中的导航控制器,并且有效的是创建了一个类似于 Kunani 定义的类别,但扩展了 UITabBarController 而不是 UINavigationController。它就像一个魅力:)

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

-(BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

@end

和 .h 文件:

#import <UIKit/UIKit.h>

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end
于 2013-06-13T21:52:58.527 回答
0

这将在 Swift 中完成

extension UITabBarController {
    public override func shouldAutorotate() -> Bool {
        if let selected = self.selectedViewController {
            return selected.shouldAutorotate()
        } else {
            return false
        }
    }

    public override func supportedInterfaceOrientations() -> Int {
        if let selected = self.selectedViewController {
            return selected.supportedInterfaceOrientations()
        } else {
            return Int(UIInterfaceOrientationMask.Portrait.rawValue)
        }
    }
}

extension UINavigationController {
    public override func shouldAutorotate() -> Bool {
        return self.visibleViewController.shouldAutorotate()
    }

    public override func supportedInterfaceOrientations() -> Int {
        return self.visibleViewController.supportedInterfaceOrientations()
    }
}
于 2014-12-11T11:48:02.830 回答
0

https://stackoverflow.com/a/30632505/2298002

处理这种情况时会出现很多模棱两可或无法预料的结果,尤其是在仅维护特定视图控制器的方向而不影响应用程序的其余部分时。这个算法似乎为我提供了一切

https://stackoverflow.com/a/30632505/2298002

于 2015-06-03T23:28:12.250 回答
-1

您应该在 中添加这个东西UIViewController1.m以确保重建以前的方向状态:

 (void)viewDidAppear:(BOOL)animated 
{

    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") 
    withObject:(id)UIInterfaceOrientationPortrait];
}

完美的!

于 2013-06-18T07:36:41.423 回答