在 UITabBarController 的横向强制特定视图控制器

Posted

技术标签:

【中文标题】在 UITabBarController 的横向强制特定视图控制器【英文标题】:Force particular viewcontroller in landscape in UITabBarController 【发布时间】:2015-01-20 11:55:49 【问题描述】:

我在 UITabBarController 中有 5 个导航控制器。 UITabBarController 中的 Navigationcontroller 之一有一个 Viewcontroller 总是横向其他所有纵向..

-(BOOL)shouldAutorotate

    return [self.topViewController shouldAutorotate];


-(NSUInteger)supportedInterfaceOrientations

    return [self.topViewController supportedInterfaceOrientations];


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    return [self.topViewController preferredInterfaceOrientationForPresentation];

上面的代码我放在 NavigationController 子类中。

-(BOOL)shouldAutorotate

    return NO;


-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskAll;


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    return UIInterfaceOrientationLandscapeLeft;

上面的代码我放在Landscape Controller中。

我有 Base 作为 UIViewController 的子类,我放了这段代码

-(BOOL)shouldAutorotate

    return NO;


-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskAll;


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    if ([self isKindOfClass:[LanscapeViewController class]])
        return UIInterfaceOrientationLandscapeLeft;
    else
        return UIInterfaceOrientationPortrait;

如果我展示该视图控制器,它可以很好地显示该屏幕仅横向。但是,如果我将 ViewController 推入,仍然是 Portrait。

【问题讨论】:

【参考方案1】:

您是否在 ViewController 中为肖像模式编写了以下代码。

    -(BOOL)shouldAutorotate

    return NO;


-(NSUInteger)supportedInterfaceOrientations

    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    return UIInterfaceOrientationPortraitUpsideDown | UIInterfaceOrientationPortrait;

【讨论】:

@TamilKing,你为什么在同一个班级里检查 kindOfClass? this if ([self isKindOfClass:[LanscapeViewController class]]) 条件始终为真,因为您在同一个 LanscapeViewController 类中。请在所有纵向 VC 中返回 UIInterfaceOrientationPortraitUpsideDown,在所有横向 VC 中返回 UIInterfaceOrientationLandscapeLeft。 这是 UIViewcontroller 的子类,子类下的所有 viewcontroller 所以只有我这样检查.. 所以 oly.. @Punita 但是你可以通过在UIViewController的每个子类中编写方法实现来覆盖超类方法。 我将您的代码放在其他类中但无法正常工作。但我提出它可以工作。感谢您的快速响应.. 如果您对答案有任何想法,请在我的答案上打勾。谢谢【参考方案2】:

查看这篇文章。 http://www.klecker.de/photo/index.php?option=com_content&task=view&id=148&Itemid=213 或者 Presenting Navigation Controller in Landscape mode is not working ios 6.0 分别。

我确实在选项卡栏应用程序中这样做了,但我没有强制旋转其中一个选项卡的直接根视图控制器,而是强制旋转其中一个子视图。我不确定这是否可以直接与选项卡栏的视图控制器之一一起使用。

【讨论】:

【参考方案3】:

创建一个UIViewController 类别来检查当前的 ViewController,

#import <UIKit/UIKit.h>

@interface UIViewController (Utils)

+(UIViewController*) currentViewController;

@end

#import "UIViewController+Utils.h"

@implementation UIViewController (Utils)

+(UIViewController*) findBestViewController:(UIViewController*)vc 

    if (vc.presentedViewController) 

        // Return presented view controller
        return [UIViewController findBestViewController:vc.presentedViewController];

     else if ([vc isKindOfClass:[UISplitViewController class]]) 

        // Return right hand side
        UISplitViewController* svc = (UISplitViewController*) vc;
        if (svc.viewControllers.count > 0)
            return [UIViewController findBestViewController:svc.viewControllers.lastObject];
        else
            return vc;

     else if ([vc isKindOfClass:[UINavigationController class]]) 

        // Return top view
        UINavigationController* svc = (UINavigationController*) vc;
        if (svc.viewControllers.count > 0)
            return [UIViewController findBestViewController:svc.topViewController];
        else
            return vc;

     else if ([vc isKindOfClass:[UITabBarController class]]) 

        // Return visible view
        UITabBarController* svc = (UITabBarController*) vc;
        if (svc.viewControllers.count > 0)
            return [UIViewController findBestViewController:svc.selectedViewController];
        else
            return vc;

     else 

        // Unknown view controller type, return last child view controller
        return vc;

    



+(UIViewController*) currentViewController 

    // Find best view controller
    UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    return [UIViewController findBestViewController:viewController];



@end

Appdelegate.m import 上面的 UIViewcontroller 类别中,导入要在 Landscape 中显示的 ViewController 并实现orientation方法为

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

    if ([[UIViewController currentViewController] isKindOfClass:[YourLandScapeViewController class]]) 

        return UIInterfaceOrientationMaskLandscape; //Orientation for LandScapeViewcontroller

    
    return UIInterfaceOrientationMaskPortrait; // rest All ViewController

【讨论】:

以上是关于在 UITabBarController 的横向强制特定视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

一个视图上的纵向 UITabBarController,另一个 UIView 上的横向视图,不工作

ios 6 中的 UITabBarController 旋转问题

UITabBarController/UINavigationController 旋转问题

如何使屏幕仅垂直。 (UITabBarController/Swift)

iOS开发中标签控制器的使用——UITabBarController

代理服务器哪家强:HAProxyVarnish与Nginx横向比较