4

我更新到 Xcode 4.5 并且正在使用 iOS6——下次有更新时我绝对不会犯这个错误;对于刚接触 iOS 的人来说,这简直是一场噩梦——我刚刚注意到我正在开发的一个应用程序正在自动旋转。在更新之前我从未注意到它自动旋转,但也有可能我只是在测试时没有旋转手机,所以我不能确定。我已将以下代码添加到主 UIViewController 并且它仍在旋转:

- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
{
    return NO;
}

这是禁用自动旋转的正确方法吗?如果是这样,那么iOS6可能会发生一些变化,我必须等到完整版本才能找到答案。但是如果我弄错了,我应该改用什么代码呢?

一如既往地感谢您的帮助。

编辑:这是我将其更改为的代码,但它仍在旋转。我弄错了吗?

- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait)
{
    return YES;
}
else 
{
    return NO;
}
}
4

3 回答 3

2

那是因为从来没有成功过。您应该选择其中一种方向。

按住命令并单击 UIInterfaceOrientation,您将看到可能选项的枚举。

然后你可以测试这些来决定你的YES场景。

我最初可能误解了你的问题。您似乎一直在说您的应用程序允许旋转。但代码应该不允许这样做。

我以为你在说它仍在触发代码。试图找到一个是

需要考虑的一件事。是否可能有多个视图控制器可用。也许您的代码没有被击中。

几个可能的问题。

  1. 你的代码甚至没有被使用。因为视图被分配为 UIViewController 而不是您的自定义视图控制器。

  2. 正在使用您的代码,但该视图控制器不是被询问有关方向的那个。因此,该特定代码没有被击中。

  3. 糟糕的构建会不断将错误的程序集放到设备上。

您的解决方案如下。

  1. 确保您的代码是正在分配的代码。您的自定义类有直接分配。或者 xib 文件正在膨胀它。当您打开 xib 文件时,请查看 Identity Inspector。选择您的视图控制器并确保将自定义类设置为您的类类型

  2. 看层次。还有哪些其他视图控制器。也许其中一个告诉应用程序它可以自动旋转到任何方向。

  3. 找到您的“DerivedData”文件夹并将其完全删除。有时这对组织者有效。其他时候你需要直接从磁盘上删除。然后清理并再次构建。

另一个解决方案也可以像在项目文件中设置设置一样简单。

从文件浏览器中选择您的项目文件,您将在摘要中看到 iPad 和 iPod 设置。您可以为要禁止的方向“取消按下”按钮。以及您没有以其他方式将方向编码到的任何视图控制器。默认情况下将使用这些。

我为混乱道歉。

更新

我通常使用此代码来处理我的自动旋转。

它不仅将 ipad 与其他 ios 设备区分开来,而且还将请求转发到呈现的控制器上,因此显示为模态的视图可以响应它想要的方式。

当你不理解它时,方向是一种痛苦:)

// Detect iPad
#define IS_IPAD() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? \
[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad : NO)

// Set preferred orientation for initial display
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    if (IS_IPAD()){
        return UIInterfaceOrientationLandscapeRight;
    }
    else {
        return UIInterfaceOrientationPortrait;
    }
}
// Return list of supported orientations.
- (NSUInteger)supportedInterfaceOrientations{
    if (self.presentedViewController != nil){
        return [self.presentedViewController supportedInterfaceOrientations];
    }
    else {
        if (IS_IPAD()){
            return UIInterfaceOrientationMaskLandscapeRight;
        }
        else {
            return UIInterfaceOrientationMaskAll;
        }
    }
}

// Determine iOS 6 Autorotation.
- (BOOL)shouldAutorotate{
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    // Return yes to allow the device to load initially.
    if (orientation == UIDeviceOrientationUnknown) return YES;
    // Pass iOS 6 Request for orientation on to iOS 5 code. (backwards compatible)
    BOOL result = [self shouldAutorotateToInterfaceOrientation:orientation];
    return result;
}
// handle iOS 5 Orientation as normal
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    // Return YES for supported orientations

    if (self.presentedViewController != nil){
        return [self.presentedViewController shouldAutorotate];
    }
    else {
        if (IS_IPAD()){
            return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
        }
        else {
            return (interfaceOrientation == UIInterfaceOrientationPortrait);
        }
    }
}
于 2012-08-29T00:47:14.950 回答
2

iOS6 中的旋转 API 发生了变化。新的 API 显然应该选择加入,但它们似乎已为模拟器或设备上的所有调试版本启用。要注册新的 API 调用,请在您的 APP Delegates 的 didFinishLoading 方法中抛出类似的内容。

//Register for new API rotation calls
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"UIApplicationSupportedInterfaceOrientationsIsEnabled"];

轮换变化的核心是两种方法(还有第三种,但我自己还在想办法)

- (BOOL)shouldAutorotate
- (NSUInteger)supportedInterfaceOrientations

您需要在您的 windows rootViewController 中覆盖这些方法。这意味着如果 UINavigationController 或 UITabBarController 是您的根控制器,您需要子类化(这对我来说似乎很奇怪,但 Apple 说 Jump)。

现在,如果您想要做的只是让您的应用程序保持纵向,请实施这两种方法,您就可以了。

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

请注意,苹果通过添加界面方向掩码进一步增加了混乱,即。UIInterfaceOrientationMaskPortrait != UIInterfaceOrientationPortrait。如果您返回 UIInterfaceOrientationPortrait ,则行为会有所不同。您也可以像组合方向一样组合蒙版,因此如果您想支持两个纵向方向,您可以使用。

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
} 

这应该有助于强制纵向。现在,如果您想做一些事情,例如允许子控制器使用不同的方向,我不知道。

于 2012-09-20T19:55:10.913 回答
1

在 iOS6 和 iOS5 中处理自动旋转的一个非常简单的方法是使用supportedInterfaceOrientations 和 shouldAutorotateToInterfaceOrientation。有一些宏使它只是一行代码。UIInterfaceOrientationIsLandscape & UIInterfaceOrientationMaskLandscape。我通过 xCode 中的自动完成功能发现了 UIInterfaceOrientationMaskLandscape 和 UIInterfaceOrientationMaskPortrait。Apple 文档中没有关于 autorotation的内容。

将此代码块添加到您的根 ViewController 以强制它仅支持横向模式。

//iOS6 code to support orientations
- (NSUInteger)supportedInterfaceOrientations
{
     return (UIInterfaceOrientationMaskLandscape);
}

//iOS5 code to support orientations
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
{
     return (UIInterfaceOrientationIsLandscape(orientation));
}

对于 iOS6,您可以使用以下方法检测方向:

  • UIInterfaceOrientationMaskLandscape
  • UIInterfaceOrientationMaskPortrait
  • UIInterfaceOrientationMaskLandscapeRight
  • UIInterfaceOrientationMaskLandscapeLeft
  • UIInterfaceOrientationMaskPortraitUpsideDown
  • UIInterfaceOrientationMaskAllButUpsideDown
  • UIInterfaceOrientationMaskAll

对于 iOS5 及更低版本,您可以使用以下方法检测方向:

  • UIInterfaceOrientationIsLandscape(宏)
  • UIInterfaceOrientationIsPortrait
  • UIInterfaceOrientationIsLandscapeRight
  • UIInterfaceOrientationIsLandscapeLeft
  • UIInterfaceOrientationIsPortraitUpsideDown
于 2013-04-22T00:38:47.557 回答