防止在视图控制器中改变方向

Posted

技术标签:

【中文标题】防止在视图控制器中改变方向【英文标题】:prevent change orientation in a viewcontroller 【发布时间】:2015-09-14 06:48:08 【问题描述】:

我有像whatsapp这样的消息应用程序...... 像这样的层次结构:

Tab Bar Controller
   Navigation Controller
       View Controller
             Target Controller

所以我们要像这样从 appDelegate 进入 Tabbar

UITabBarController  *ivc = [storyboard instantiateViewControllerWithIdentifier:@"mainTab"];
self.window.rootViewController = ivc;
[self.window makeKeyAndVisible];

我的问题 我想在 Target Controller 的某些条件下锁定方向 但是-(BOOL)shouldAutorotatesupportedInterfaceOrientations 没有打电话,我已经阅读了一些关于此的帖子,但我找不到正确的解决方案。 像这样的帖子: Lock Screen Rotation in ios 8

Handling autorotation for one view controller in iOS7

更新

经过几个小时的搜索,我找到了解决方案,但这还不够 这个链接提示我,如果我们使用 UITabController 一切都会改变,我们应该调用

-(NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController

return navigationController.topViewController.supportedInterfaceOrientations;
  

-(NSUInteger)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController
     
return ((parentOfTarget*)[tabBarController.viewControllers objectAtIndex:0]).supportedInterfaceOrientations;
 

这导致我发出改变方向的通知并阻止它,但我会看到状态栏的方向。

我想我需要打电话

navigationController.topViewController.shouldAutorotate;

但它会导致崩溃;(

TabBarController: Orienting views in different orientations

【问题讨论】:

【参考方案1】:

你应该使用-supportedInterfaceOrientations' instead of-shouldAutorotate`。

只有在运行时确定方向时才应使用“稍后”。在您的情况下,您的视图控制器将始终只支持纵向模式。

接下来,导航控制器的委托必须实现以下方法,以返回在导航堆栈顶部的视图控制器上调用 -supportedInterfaceOrientations 的结果。

-(NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController 
    return navigationController.topViewController.supportedInterfaceOrientations;

【讨论】:

我已经调用了supportedInterfaceOrientations,但没有一个在我的ViewController中调用,我会试试你的提示。 (我应该在哪里实现这个 Delegate ,在 TagetViewController 中? 任何方向代表都没有在我的viewController 中调用,只有wilRotatedidRoate 在我的ViewControoler 中调用,我对此感到非常困惑。 @请再检查一遍兄弟【参考方案2】:

使用此方法停止横向显示

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

    // Use this to allow upside down as well
    //return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);

如果你想使用 shouldAutorotate 委托方法,你可以在 appdelegate.m 中使用。

- (BOOL)shouldAutorotate 
    return NO;

如果您使用的是最新的 ios,请使用以下方法:-

- (NSUInteger) supportedInterfaceOrientations 
    // Return a bitmask of supported orientations. If you need more,
    // use bitwise or (see the commented return).
    return UIInterfaceOrientationMaskPortrait;
    // return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;


- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation 
    // Return the orientation you'd prefer - this is what it launches to. The
    // user can still rotate. You don't have to implement this method, in which
    // case it launches in the current orientation
    return UIInterfaceOrientationPortrait;

【讨论】:

它已被弃用,也不会在我的视图控制器中调用 我知道它已被弃用,但它的工作原理......好的,你可以看到我对此查询的更新答案 还不行,是UINavigationController引起的

以上是关于防止在视图控制器中改变方向的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器之间切换时自动旋转

UIView 子视图不会改变方向

防止 actionlink 改变当前视图

从 UINavigationController 弹出视图会改变设备方向

如何在 Objective-C 中不旋转的视图控制器中检测设备的真实方向?

当设备方向改变时导致子视图重绘的正确方法是啥?