io6允许基于某些条件的界面方向

时间:2013-08-19 12:02:52

标签: ios orientation

我有一个标志,用户将从设置中设置它。如果设置为“否”,则仅允许纵向方向。如果flag为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 

但没有成功。 请帮帮我。

EDIT 我试过这个。

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

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

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

1 个答案:

答案 0 :(得分: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

更新

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

我刚创建了一个演示应用来复制你想要做的事情:

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

project setup

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

Landscape Denied

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

enter image description here

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

另外,我不知道使用自动布局是否会干扰,我倾向于不使用它。在我的XIB文件中的View中,我选择了“View”对象,然后在检查器中,我取消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 AutoRotate In UiNavigationController

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

enter image description here

enter image description here