在 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)