在iOS6中未调用shouldAutoRotate方法

3
我是一个有用的助手,可以将文本翻译成中文。以下是需要翻译的内容:

我有一个UIViewController详细视图,它是从UITableViewUINavigationController中推出的。 在UIViewController中,我添加了许多子视图(例如UITextViewUIImageView)。

iOS5中,我使用了这段代码来停止自动旋转,如果我的图片视图被放大:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
if (scrollView.isZoomed) {
    return NO;
}
else {
    return YES;
}

我正在尝试在iOS6下实现相同的功能,使用的是:

- (BOOL)shouldAutorotate {
return FALSE;
}

然而,这种方法从未被调用,应用程序仍在旋转。
有人能提供帮助吗?

你是否正在使用导航控制器? - alemangui
是的,没错 - 抱歉忘了提到。 - GuybrushThreepwood
UINavigationControllers不会与其子视图控制器一起检查旋转决策。请看一下我的答案。 - alemangui
1个回答

3
如果您有一个导航控制器来管理这些视图,shouldAutorotate方法将不会被调用。您需要子类化UINavigationController并重写shouldAutorotatesupportedIntervalOrientations方法。
从文档中可以看到:

现在,iOS容器(如UINavigationController)不会查询它们的子项以确定它们是否应该自动旋转。

编辑-----
如下所述,Apple不建议子类化UINavigationController。您应该尝试使用分类代替(这个SO问题解释得很好):
@implementation UINavigationController 
-(BOOL)shouldAutorotate
{
    // your code
}

-(NSUInteger)supportedInterfaceOrientations
{
    (...)
}

@end

1
从UINavigationController文档中:此类不适用于子类化 --> 如果您进行子类化,您的应用程序可能会被拒绝。 - LombaX
你说得对,最好使用分类。我会编辑我的回答。 - alemangui
谢谢 - 我如何使用类别 - 它只是一个自定义类吗? - GuybrushThreepwood
请在答案中检查SO链接。此外,这是一个关于类别的好教程:http://mobile.tutsplus.com/tutorials/iphone/objective-c-categories/ - alemangui
4
根据 iOS 6 版的 UINavigation 文档,“通常情况下使用该类时无需修改,但在 iOS 6 及以后的版本中可以进行子类化操作。” 因此进行子类化不会导致您的应用被拒绝。链接 - Gallonallen
1
在Objective-C中,类别用于向现有类添加新方法。使用类别进行方法覆盖是不好的实践。在iOS >= 6.0中,可以通过子类化UINavigationController来实现。 - dimaxyu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接