1

我有一个标志,用户将从设置中设置它。如果设置为否,则仅允许纵向。如果标志为 YES,那么纵向和横向都将被允许。在 ios 5 及更低版本中

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    //[image_signature setImage:[self resizeImage:image_signature.image]];
    if(flag == YES)
        return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationPortrait);
    else
        return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

但在 ios 6 及更高版本中,不推荐使用上述方法。我在尝试

-(BOOL)shouldAutorotate 
- (NSUInteger)supportedInterfaceOrientations 

但没有成功。请帮我。

编辑我试过这个。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    NSLog(@"preferredInterfaceOrientationForPresentation");
    return UIInterfaceOrientationMaskPortrait;
}

- (NSUInteger)supportedInterfaceOrientations
{
    NSLog(@"supportedInterfaceOrientations");
    return UIInterfaceOrientationMaskPortrait;
}

但只有 supportedInterfaceOrientations 只被调用一次。当我改变模拟器的方向时,两种方法都没有调用。

4

1 回答 1

4
shouldAutorotateToInterfaceOrientation:
Returns a Boolean value indicating whether the view controller supports the specified orientation. 
(Deprecated in iOS 6.0. Override the supportedInterfaceOrientations and preferredInterfaceOrientationForPresentation methods instead.)

http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixADeprecatedAPI.html

因此,您可以在较新版本中使用的两种方法是:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/preferredInterfaceOrientationForPresentation

- (NSUInteger)supportedInterfaceOrientations

此方法使用以下位掩码

UIInterfaceOrientationMaskPortrait

UIInterfaceOrientationMaskLandscapeLeft

UIInterfaceOrientationMaskLandscapeRight

UIInterfaceOrientationMaskPortraitUpsideDown

UIInterfaceOrientationMaskLandscape

UIInterfaceOrientationMaskAll

UIInterfaceOrientationMaskAllButUpsideDown

http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/supportedInterfaceOrientations

更新:

好的,我不确定为什么它不适合你。

我刚刚创建了一个演示应用程序来复制您正在尝试做的事情:

使用右键单击>复制图像网址并在新的浏览器选项卡中打开以查看更大的图片

项目设置

当方向标志为 NO 时,按钮文本显示“Landscape Denied”,并且在模拟器中旋转设备不会导致界面旋转,如预期的那样:

景观被拒绝

然而,在单击按钮以允许横向方向后,旋转模拟器设备实际上会改变界面的方向,如预期的那样:

在此处输入图像描述

您在另一个根视图控制器中没有任何其他方向委托方法覆盖当前视图控制器的方向委托方法,对吗?

另外,我不知道使用自动布局是否会干扰,我倾向于不使用它。在我的 XIB 文件中的视图中,我选择了“视图”对象,然后在检查器中,我取消了“ Use Auto Layout”。我上面的示例项目屏幕截图没有使用自动布局。

更新 2:

好吧,我找到了这个解决方案,它与导航控制器一起作为窗口的根视图控制器工作(把它放在你的 AppDelegate.m 中):

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    NSUInteger orientations =UIInterfaceOrientationMaskAllButUpsideDown;

    if(self.window.rootViewController)
    {
        UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presentedViewController supportedInterfaceOrientations];
    }
    return orientations;
}

在这个 Stackoverflow 帖子中:

iOS 6 自动旋转在 UiNavigationController

带有导航控制器的新屏幕截图:

在此处输入图像描述

在此处输入图像描述

于 2013-08-19T12:10:26.970 回答