iOS横屏开发

作者: 宙斯YY | 来源:发表于2018-07-21 16:05 被阅读258次

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

    系统支持横屏顺序
    默认读取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横屏开发

        本文链接:https://www.haomeiwen.com/subject/ghvhmftx.html