iPhone - 仅在一个viewcontroller上允许横向显示

时间:2010-01-27 04:12:54

标签: iphone cocoa-touch

我有一个基于导航的应用程序,我希望其中一个viewcontrollers支持横向方向。对于那个viewcontroller(vc1),在shouldAutorotate中,我为所有方向返回YES,而在其他控制器中我返回YES仅用于纵向模式

但即便如此,如果设备处于横向模式并且我从vc1进入下一个屏幕,则下一个屏幕也会以横向模式旋转。我假设如果我仅为肖像模式返回YES,则屏幕应仅以纵向显示。

这是预期的行为吗?我如何实现我的目标?

感谢。

3 个答案:

答案 0 :(得分:24)

如果您使用UIViewController的 shouldAutorotateToInterfaceOrientation 方法,则不能仅为其中一个视图控制器支持横向。
您只有两个选择,即所有视图控制器是否支持景观,或者没有视图控制器支持它
如果只想为一个支持景观,则需要检测设备旋转并在viewcontroller中手动旋转视图 您可以使用通知检测设备旋转。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

然后,您可以在检测到设备旋转时旋转视图。

- (void)didRotate:(NSNotification *)notification {
    UIDeviceOrientation orientation = [[notification object] orientation];

    if (orientation == UIDeviceOrientationLandscapeLeft) {
        [xxxView setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
    } else if (orientation == UIDeviceOrientationLandscapeRight) {
        [xxxView setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    } else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
        [xxxView setTransform:CGAffineTransformMakeRotation(M_PI)];
    } else if (orientation == UIDeviceOrientationPortrait) {
        [xxxView setTransform:CGAffineTransformMakeRotation(0.0)];
    }
}

答案 1 :(得分:5)

当我在portait模式下需要所有视图控制器时,我也有这种情况,但其中一个也可以旋转到横向模式。而这个视图控制器有导航栏。

为此,我创建了第二个窗口,在我的例子中是摄像机视图控制器。当我需要显示摄像机视图控制器时,我会显示摄像机窗口并在需要按下另一个视图控制器时隐藏。

您还需要将此代码添加到AppDelegate。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{   
    if (window == self.cameraWindow)
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }

    return UIInterfaceOrientationMaskPortrait;
}

答案 2 :(得分:0)

当我为我的应用程序工作时,我建议您使用此解决方案。通过在shouldAutorotateToInterfaceOrientation方法方向类型中使用一些条件,我们可以解决此问题。只需尝试使用此链接将帮助您。

https://stackoverflow.com/questions/12021185/ios-rotate-view-only-one-view-controllers-view/15403129#154031