iOS 部分页面横屏

客户要求在项目中添加一些html5小游戏,但是小游戏是要求横屏的。查了之后发现一旦你在这里选了只支持竖屏之后,无论怎么改都没办法横屏了。

E76F10FD-C34F-4FC4-85DC-0AA7CD245EC2.png

无奈之下,只能打上勾,找另一种方法来实现了。

- (BOOL)shouldAutorotate {
   return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
    return NO;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return  UIInterfaceOrientationPortrait;
}

这个方法可以实现,需要在根视图(nav,tabbar)和vc里重写。

我选的另外一种更简单方法是
在AppDelegate.m中

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (_flag == 1) {
        return UIInterfaceOrientationMaskLandscapeRight;
    }
    else
    {
        return (UIInterfaceOrientationMaskPortrait);
    }
}

参数显而易见,UIInterfaceOrientationMask是返回你允许的屏幕状态,多个状态用|号。我这里只需要为游戏横屏,所以只支持右转。
_flag是一个AppDelegate的一个参数,当然,你也可以用一个单例类保存。
在你需要它横屏的VC里,在viewDidLoad里将_flag改为1。但这里有几个点需要注意:
1:使用模态弹出可以让屏幕出现的时候就是横屏,如果是push,它出现的时候是竖屏的,虽然在你横屏之后它不会再变为竖屏了。
2:可以使用push,但你需要在IB中将视图选为横屏。这样它push之后直接就是横屏了。

iOS 部分页面横屏_第1张图片
2CB32AC3-0D67-4BEF-90E4-B707131968BE.png

3.如果你present一个nav的话。需要自定义一个nav,同样的在它的viewDidLoad里将_flag改为1

另外,我还发现了一个通过接受方向通知,旋转VC.view的方法,它的好处是可以在只支持竖屏的项目里达到旋转屏幕的效果,缺点在于不是真正意义上的横屏,状态栏,iphone的上下拉菜单还是竖屏的。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientChange:) name:UIDeviceOrientationDidChangeNotification object:nil];

- (void)orientChange:(NSNotification *)noti {
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    switch (orientation)
    {
        case UIDeviceOrientationPortrait: {
            [UIView animateWithDuration:0.25 animations:^{
                
                
                self.view.transform = CGAffineTransformMakeRotation(0);
                self.view.frame = CGRectMake(0, 0, kIPHONE_WIDTH, kIPHONE_HEIGHT);
              
            }];
        }
            break;
        case UIDeviceOrientationLandscapeLeft: {
            [UIView animateWithDuration:0.25 animations:^{
                self.view.transform = CGAffineTransformMakeRotation(M_PI*0.5);
                self.view.frame = CGRectMake(0, 0, kIPHONE_WIDTH, kIPHONE_HEIGHT);
          
            }];
        }
            break;
        case UIDeviceOrientationLandscapeRight: {
            [UIView animateWithDuration:0.25 animations:^{
                self.view.transform = CGAffineTransformMakeRotation(-M_PI*0.5);
                self.view.frame = CGRectMake(0, 0, kIPHONE_WIDTH, kIPHONE_HEIGHT);
              
            }];
        }
            break;
        default:
            break;
    }
}

你可能感兴趣的:(iOS 部分页面横屏)