ios 6 中的 UITabBarController 旋转问题

Posted

技术标签:

【中文标题】ios 6 中的 UITabBarController 旋转问题【英文标题】:UITabBarController Rotation Issues in ios 6 【发布时间】:2012-09-21 00:47:32 【问题描述】:

确认!我终于在 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 中效果很好

我已经有一段时间了

谢谢, 扎克

【问题讨论】:

因此,出于挫败感,我只使用标签栏应用程序模板在 xcode 中创建了一个 barbones uitabbar 应用程序。我添加了 (BOOL)shouldAutorotate return NO; 和 -(NSUInteger)supportedInterfaceOrientations 返回 UIInterfaceOrientationMaskPortrait; 到默认选项卡视图的两个窗口。但是,两个窗口仍然旋转。这是 iOS 6.0 中的错误吗?有没有人能够阻止标签栏旋转窗口而不禁用所有窗口在目标 - >摘要中旋转? 【参考方案1】:

扎克,我遇到了同样的问题。这是因为您将 viewController 嵌入到 TabBar Controller 或 UINavigationController 中,并且对这些方法的调用发生在这些方法中,而不是您的普通 View(在 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

【讨论】:

很好的解决方案并为此 +1。 Kunani,这太棒了。我实际上为 UITabBarController+autoRotate 创建了一个类别,并且效果很好!你是救生员。 嘿Kunani...这对我不起作用,所以我的代码可能做错了,所以请您...提供此演示的源代码吗? 很好的答案 Kunani。我想知道在我的情况下你会怎么做,如果你有时间的话,请看看我的问题。干杯***.com/questions/13195230/… 感谢这工作。我们不得不这样做似乎很愚蠢:S【参考方案2】:

如果您像我一样有一个标签栏,您唯一需要做的就是将以下内容添加到您的委托 .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

【讨论】:

【参考方案3】:

我还有一个问题,我需要一些视图来旋转,而另一些视图不需要几个导航控制器。我通过告诉 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

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

无论如何都为我工作......

【讨论】:

圆滑的人。真正的顺利。我想知道为什么苹果决定走这条路? 我在使用此代码时遇到的一个问题是在横向模式下将视图控制器弹出到仅支持纵向的视图控制器。我一生都无法弄清楚如何在弹出之前将其强制恢复为纵向。我已经尝试更改状态栏方向并执行设置当前设备方向的旧技巧,但都没有效果(不再允许更改当前设备) 我遇到了同样的问题。 @pir800,你有没有解决这个问题? @pir800 ,这是在弹出/推送时强制正确方向的解决方案:***.com/a/14445888/338514【参考方案4】:

我的情况是:

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;

它就像一个魅力!

【讨论】:

谢谢!!这就是我要找的!! 这工作正常,除非 VC2 在横向模式下弹出,VC1 不会旋转回纵向 - 保持横向模式。【参考方案5】:

在我的例子中,我有一个嵌入在 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

【讨论】:

【参考方案6】:

这将在 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()
    

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

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

 (void)viewDidAppear:(BOOL)animated 


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

完美!

【讨论】:

setOrientation 是 UIDevice 的私有方法,提交此类代码可能会被拒绝

以上是关于ios 6 中的 UITabBarController 旋转问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 uitabbarcontroller 中的 uibutton 单击事件上推送其他视图控制器?

iOS 6 中的导航栏看起来像 iOS 7 中的栏

UITableView 在 IOS 7 与 IOS 6 中的行为不同

在 Xcode 6 中的 iOS 6 模拟器中运行应用程序

iOS 6 中的 didReceiveMemoryWarning

ios 6 中的 UITabBarController 旋转问题