iOS如何指定某个页面可以旋转屏幕,其余控制器都正常竖屏?

路飞
  • 223

需求是这样的:
整个App的大部分界面都是竖屏显示,且只允许竖屏显示。
只有单独几个页面可以切换横竖屏,比如视频播放页面,图片浏览界面。

按照网上的方法试了好久,都没成功,求助!!!

回复
阅读 12.9k
8 个回答
hudi
  • 947

在AppDelegate.m中

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (_allowRotation == 1) {
        return UIInterfaceOrientationMaskAll;
    }else{
        return (UIInterfaceOrientationMaskPortrait);
    }
}

// 支持设备自动旋转
- (BOOL)shouldAutorotate
{
    if (_allowRotation == 1) {
        return YES;
    }
    return NO;
}

写这两个方法

在你要旋转的controller中一开始的地方写这两句就可以了

_appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; _appDelegate.allowRotation = 1;

在要这个controller要消失的时候 写_appDelegate.allowRotation = 0;就可以了

一开始我也向上面那样设置了,但是后来显示的结果还是不对,虽然界面是竖屏显示,但是整体还是横屏的,状态栏之类的还是在横屏。后来参考了下面的方法解决了:
http://www.devdiv.com/iOS_iPhone-ios_xcode_-thread-211995-1-1.html

//点击按钮旋转到横屏
- (void)switchToLandscape
{
    [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"];
    //上一句话是防止手动先把设备置为横屏,导致下面的语句失效.
    [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
}

//点击返回旋转到竖屏
- (void)switchToPortrait
{
    [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
    //上一句话是防止手动先把设备置为竖屏,导致下面的语句失效.
    [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
}

这个我写在了viewController里面,在跳转里面对应设置就好了。
其他答案中提到的那2个函数也要对应添加:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    if (_isAllowRotation == YES) {
        return UIInterfaceOrientationMaskLandscape;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

关于设备的旋转方法,前面两个返回NO,就不支持旋转了,最后一个支持的旋转方向

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

  • (BOOL)shouldAutorotate
    {
    return NO;
    }

  • (UIInterfaceOrientationMask)supportedInterfaceOrientations
    {
    return UIInterfaceOrientationMaskAll;
    }

董诗磊ios
  • 5
新手上路,请多包涵

你是如何解决的

在工程设置里面选择Portrait,就像这样:设定

然后在可以旋转的视图的ViewController里面加上:

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return .AllButUpsideDown
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏