【问题标题】:Really Stuck on Screen Rotation iOS 6, I Need a xib locked to portrait真的卡在屏幕旋转 iOS 6 上,我需要一个锁定为纵向的 xib
【发布时间】:2012-12-23 17:19:38
【问题描述】:

在这里阅读了 IOS 6 中处理屏幕旋转的所有方法、Apple 文档和激烈的谷歌搜索后,在使用 xibs 时我仍然坚持这一点。

我想要实现的是只有几个 iPad 的 xib,只有横向,应用程序的其余部分是纵向的。

如果我使用情节提要,我了解如何对导航控制器进行子类化以覆盖旋转,但我不是,我正在使用 xibs 并且希望任何输入如何与 xibs 一起使用

在我的应用委托中:

ICHomeController *homeController = [[ICHomeController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:homeController];
navController.navigationBarHidden = YES;
navController.navigationBar.barStyle = UIBarStyleBlackOpaque;
navController.navigationBar.tintColor = [UIColor grayColor];
self.navigationController = navController;
[self.window setRootViewController:self.navigationController];
[self.window makeKeyAndVisible];
return YES;

除了尝试这里似乎所有的解决方案之外,我还在我的 vew 控制器中尝试了显而易见的方法,但据我所知,在 iOS 6 中它不会被调用。

// Older versions of iOS (deprecated)
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}


 - (BOOL)shouldAutorotate {
return YES;
 }


 - (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
 }


 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeLeft;
}

【问题讨论】:

    标签: objective-c ios cocoa-touch


    【解决方案1】:

    这几天我也一直在用更复杂的导航结构来解决这个问题。

    基本规则似乎是 ROOT 控制器,无论是 UINavigationController、UITabBarController 还是简单的 UIViewController,都可以控制旋转。因此,当您将 UIViewControllers 推入堆栈时,第一个仍然控制旋转。

    如果您使用模态视图,则此模型视图将被视为堆栈的根,直到它被解除。因此,如果您显示模态 UIViewController 然后将视图推送到其顶部,则作为模态视图呈现的 UIViewController 将控制旋转。 只需确保模态视图使用 presentViewController:animated:completion。

    让某些视图处于不同轮换状态的最简单方法是以模态方式呈现。 如果无法避免,请直接返回您的第一个视图或 nag 控制器并设置旋转。

    在您的轮换方法中添加一些 NSLog(@"%s", __FUNCTION__); 语句,以查看正在调用哪些语句。

    在您上面的代码中,只有第一种方法是旧的 iOS5(现已弃用)方法。其他 3 个是新的 iOS 6 方法。

    使用上面的示例代码,您需要继承 UINavigationController。为此,请创建一个新类作为具有不同名称的 UINavigationController 子类,例如。 MyNavigationController 并向其添加旋转方法。然后在上面的代码中而不是使用 UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:homeController];

    你会使用:

    MyNavigationController *navController = [[MyNavigationController alloc] initWithRootViewController:homeController];

    另外,请确保您在此处选择了允许的方向:

    【讨论】:

    • 什么都没有被调用我在这个过程的早期添加了日志,我支持 iOS 5 和 6,因此不推荐使用的方法仍然存在。该应用程序很复杂,而不是我的代码,并且真的无法解决。我在我的根视图控制器中使用我的旋转代码作为它被推送到堆栈上,我根本无法得到这些方法的任何确认。虽然我原则上理解,并且可以在情节提要中做到这一点,但使用 xibs 只是没有它。感谢您的更新答案让我试试看...
    • 您的 viewController 不是根,导航控制器是。所以必须对 navController 进行子类化才能使旋转工作。
    • 这是有道理的,感谢您的建议(为您加 1),现在我已将我的导航控制器细分为屏幕旋转,一定有比这更简单的方法!
    • 你有没有把NSLog放进去看看子类nav控制器中是否调用了方法?
    • 另外,在你的代码中你有这个self.navigationController = navController; [self.window setRootViewController:self.navigationController];当然应该只是window.rootViewController = navController;
    【解决方案2】:

    我遇到了同样的问题。这就是在 5 和 6 中对我有用的方法。

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    
        return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }
    
    - (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0)
    {
        return NO;
    }
    
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0) {
        return UIInterfaceOrientationLandscapeLeft;
    }
    

    在目标摘要方面,只有纵向模式是“支持”的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      相关资源
      最近更新 更多