客户要求在项目中添加一些html5小游戏,但是小游戏是要求横屏的。查了之后发现一旦你在这里选了只支持竖屏之后,无论怎么改都没办法横屏了。
无奈之下,只能打上勾,找另一种方法来实现了。
- (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之后直接就是横屏了。
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;
}
}