一.指定某个页面横屏竖屏。
系统支持横屏顺序
默认读取plist里面设置的方向(优先级最低)
application设置的级别次之
然后是UINavigationcontroller
级别最高的是UIViewController
例如:A界面跳转到B界面,A界面是竖屏的,B界面进入就要横屏。
方案一:
1.首先设置项目 支持的屏幕方向
如果不选择左或者右那么页面想要左右横屏都是不可能的,先全局设置横屏能力。
2.在项目继承了UINavigationController的子类CusNavigationController中重写方法:shouldAutorotate和supportedInterfaceOrientation
//支持旋转
-(BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}
//支持的方向
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
3.界面A中,重写旋转方法 和 支持的方向
-(BOOL)shouldAutorotate
{
return YES;
}
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
4.界面A跳转界面B的方法
ViewController2 * vc=[[ViewController2 alloc]init];
[self presentViewController:vc animated:YES completion:nil];
//[self.navigationController pushViewController:vc animated:YES];
5.界面B重写 旋转方法 和 支持的方向
-(BOOL)shouldAutorotate
{
return YES;
}
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscapeLeft;
}
//一开始的方向
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}
这个方式有个缺点就是跳转方式只能是model生效,push不生效。
补充说明:测试发现如果打开锁屏功能,之前不实现两个继承的shouldAutorotate和supportedInterfaceOrientations方法的页面会出现不适配的横屏问题。解决方法就是在CusNavigationController的shouldAutorotate方法中返回NO,保证所有ViewController都是不可旋转的。A页面可以不重写这两个方法,B页面支持旋转就行。
方案二:
利用KVC调用私有方法-横屏
if([[UIDevice currentDevice]respondsToSelector:@selector(setOrientation:)])
{
SEL seletor=NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation=[NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:seletor]];
[invocation setSelector:seletor];
[invocation setTarget:[UIDevice currentDevice]];
int val=UIInterfaceOrientationLandscapeRight;
[invocation setArgument:&val atIndex:2];
[invocation invoke];
}
二.监听横竖屏状态并适配UI
使用通知监听
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(change:) name:UIDeviceOrientationDidChangeNotification object:nil];
监听方法
-(void)change:(NSNotification*)notification
{
CGFloat width=[UIScreen mainScreen].bounds.size.width;
CGFloat height=[UIScreen mainScreen].bounds.size.height;
if(width/height<1.0)
{
NSLog(@"竖屏");
placeView.frame=CGRectMake(0, 0, 50, self.view.frame.size.height);
}else
{
NSLog(@"横屏");
placeView.frame=CGRectMake(0, 0, 100, self.view.frame.size.height);
}
}
三.强制横屏其实就暴力的一句
if(self.isScreenRight)
{
[[UIDevice currentDevice]setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"];
}else
{
[[UIDevice currentDevice]setValue:@(UIInterfaceOrientationLandscapeRight) forKey:@"orientation"];
}