iOS横屏开发

一.指定某个页面横屏竖屏。

系统支持横屏顺序
默认读取plist里面设置的方向(优先级最低)
application设置的级别次之
然后是UINavigationcontroller
级别最高的是UIViewController
例如:A界面跳转到B界面,A界面是竖屏的,B界面进入就要横屏。

方案一:

1.首先设置项目 支持的屏幕方向
如果不选择左或者右那么页面想要左右横屏都是不可能的,先全局设置横屏能力。


1.png

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"];
            }

你可能感兴趣的:(iOS横屏开发)