当前位置: 首页 > 知识库问答 >
问题:

iOS6:如何将某些视图限制为肖像并允许其他视图旋转?

秋煌
2023-03-14

我有一个iPhone应用程序,它使用一个UINavigationController来呈现一个深入的界面:首先是一个视图,然后是另一个视图,最多四层。我希望前三个视图限制为纵向,并且只允许最后一个视图旋转为横向。当从第四个视图返回到第三个视图时,第四个视图是横向的,我希望所有的东西都旋转回纵向。

在iOS5中,我简单地在我的每个视图控制器中定义应AutorotateToInterfaceOrience:以返回YES作为允许的方向。一切都如上所述工作,包括即使设备在从视图控制器#4返回到#3时处于横向方向也返回纵向。

在iOS6中,所有视图控制器都旋转到横向,打破了那些不应该的。iOS6发行说明说

更多的责任转移到应用程序和应用程序代表身上。现在,iOS容器(如UINavigationController)不会咨询其子容器以确定是否应该自动旋转。[...] 每当设备旋转时或每当视图控制器显示为全屏模式显示样式时,系统都会向最顶层的全屏视图控制器(通常为根视图控制器)询问其支持的界面方向。此外,仅当此视图控制器从其shouldAutorotate方法返回YES时,才会检索支持的方向。[...] 系统通过将应用程序的SupportedInterfaceDirectionsforWindow方法返回的值与最顶端的全屏控制器的SupportedInterfaceDirections方法返回的值相交来确定是否支持方向。

因此,我将UINavigationController子类化,为我的主导航控制器(MainNavigationController)提供了一个布尔属性(boolean property)landscapeOK(landscapeOK),并使用该属性返回支持的接口方向(supportedInterfaceOrientations)中允许的方向。然后,在我的每个视图控制器的视图中将出现:方法中,我有这样一行

    [(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

告诉我的主导航控制器所需的行为。

问题来了:如果我现在导航到竖屏的第四个视图,把手机翻过来,它会旋转到横向。现在我按下后退按钮返回我的第三个视图,它应该只工作纵向。但是它不会旋转回来。我怎么让它做到这一点?

我试过了

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]

在我的第三个视图控制器的方法中,视图将出现,但它不起任何作用。这是一个错误的调用方法还是一个错误的调用位置,或者我应该以完全不同的方式实现整个过程?

共有3个答案

涂飞航
2023-03-14

在看了无数类似问题的每个答案之后,没有一个答案对我有用,但它们确实给了我一些想法。以下是我最终解决问题的方式:

首先,确保项目目标中支持的界面方向包含旋转视图所需的所有方向。

接下来,创建UINavigationController的类别(因为Apple说不要对其进行子类化):

@implementation UINavigationController (iOS6AutorotationFix)

-(BOOL)shouldAutorotate {
    return [self.topViewController shouldAutorotate];
}

@end

将您希望能够旋转的类别和视图控制器(我将其称为旋转视图控制器)导入到您的最高级别视图控制器,该视图控制器应包含导航控制器。在该视图控制器中,实现自动旋转,如下所示。请注意,这不应是要旋转的视图控制器。

-(BOOL)shouldAutorotate {

    BOOL shouldRotate = NO;

    if ([navigationController.topViewController isMemberOfClass:[RotatingViewController class]] ) {
        shouldRotate = [navigationController.topViewController shouldAutorotate];
    }

    return shouldRotate;
}

最后,在旋转视图控制器(RotatingViewController)中,实现应自动旋转(shouldAutorotate)和支持的界面方向(InterfaceOrientations),如下所示:

-(BOOL)shouldAutorotate {
    // Preparations to rotate view go here
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown; // or however you want to rotate
}

之所以需要这样做,是因为iOS 6将旋转控制权授予根视图控制器,而不是俯视图控制器。如果希望单个视图的旋转行为不同于堆栈中的其他视图,则需要在根视图控制器中为其编写特定的案例。

彭浩穰
2023-03-14

添加CustomNavigationController

覆盖其中的这些方法:

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

现在在plist中添加所有方向

在视图控制器中,仅添加所需的:

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

这些方法覆盖导航控制器方法

施茂
2023-03-14

我也遇到了同样的问题,找到了一个适合我的解决方案。要使其正常工作,仅在UINavigationController中实现支持的接口方向(interface orientations)是不够的。您还需要在控制器#3中实现此方法,它是第一个仅在弹出控制器#4后才纵向显示的方法。因此,我的UINavigationController中有以下代码:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.isLandscapeOK) {
        // for iPhone, you could also return UIInterfaceOrientationMaskAllButUpsideDown
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

在view controller#3中,添加以下内容:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

无需向视图控制器#1、#2和#4添加任何内容。这对我有用,我希望它能帮助你。

 类似资料:
  • 我有一个带有子视图控制器的视图控制器。 应强制A始终保持纵向,但应允许B自由旋转。 我知道shouldAutorotate应该适用于任何视图控制器及其子级,但有什么方法可以绕过它吗?看起来我可以使用shouldAutorotateToInterfaceOrientation,但这在iOS 8中被阻止了。 我想保持视频播放器静态(因此无论设备方向如何,水平视频始终是水平的),而控制层子视图覆盖允许自

  • 我正在开发一个应用程序,它具有通过拖动右下角按钮来调整和旋转imageview的功能。 我看到一个应用程序,它有一个功能,如果我们拖动右下角的按钮对角,imageview大小已经调整,或者如果我们拖动按钮向左或向右的方向,imageview已经按照方向旋转。我希望在我的应用程序中实现此功能 我正在努力实现单指旋转以及调整imageview的大小。 我可以通过拖动它的右下角按钮成功地实现调整图像视图

  • 我有一个定制的摄像头活动,应该只在纵向模式下拍照,但是在三星设备上,照片总是在我的nexus设备上以横向模式显示,图片在纵向模式下正确显示。下面是我设置相机参数和方向的方法。此初始化预览在方法。

  • 问题内容: 在我的应用程序中,我在div中有一个图像,一个按钮。 我想旋转显示的图像,并在使用jquery单击按钮时保存旋转的图像。 我已经使用了代码: http://code.google.com/p/jquery-rotate/ 和jQuery代码: html代码: 当我使用上述代码时,有两个图像,一个是旧图像,另一个是旋转图像。 在这里我想旋转相同的图像并仅显示旋转的图像。并将旋转的图像保存

  • 我知道有很多关于如何在IOS6中强制定向的线程,但它们似乎都不适合我,所以现在我需要一些帮助来解决这个问题。 我有一个基于导航的应用程序,它有许多视图控制器。除了必须在横向模式下加载(用户无需先转动手机)的视图外,所有这些视图都是纵向视图。 在导航控制器的实现中,我添加了shouldAutorotate、supportedInterfaceOrientations和preferredInterfa

  • 请建议我使用的任何方法来创建它。 查询:我正在创建2-spinner视图,在那里我必须添加国家/城市列表,所以如果我选择印度,那么我在下拉视图中得到50个项目,这个问题是它占用了整个页面的高度。 我想要的:我想要创建一个下拉视图,在下拉视图中用户只能看到10个项目,其他项目将显示每当用户将滚动下拉视图。