美文网首页
iOS 强制横竖屏

iOS 强制横竖屏

作者: daihz | 来源:发表于2017-06-09 00:04 被阅读0次

    最近在修改直播项目出现的问题,需要在直播页面强制进入横屏,记录下遇到的坑,稍后会写一篇阿里云直播的文章.


    • 程序单独页面强制改变方向(横竖屏)

    在需要改变屏幕方向的类使用这个方法 (需要设置DeviceOrientation方向)
    CC9E3A21-1E61-48E9-B083-EE9033F200E0.png
       if([[UIDevice currentDevice]respondsToSelector:@selector(setOrientation:)]) //判断对象是否响应setOrientation方法 
       respondsToSelector实例方法,判断对象是否响应某个方法instancesRespondToSelector类方法,判断类是否响应某个方法
         {
            SEL selector = NSSelectorFromString(@"setOrientation:");
             //NSInvocation对象只能使用其类方法来初始化,不可使用alloc/init方法。它执行调用之前,需要设置两个方法:setSelector: 和setArgument:atIndex:
    //创建签名函数
             NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
    //设置selector
             [invocation setSelector:selector];
     
             [invocation setTarget:[UIDevice currentDevice]];
     
             int state = UIInterfaceOrientationLandscapeLeft;//需要设置的状态
        UIInterfaceOrientationUnknown            =        UIDeviceOrientationUnknown,
        UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,//垂直,home 键在下
        UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,//垂直,home 键在上
        UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,//水平,home 键在右
        UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft//水平,home 键在左
     //atIndex的下标必须从2开始.原因:0 1 两个参数已经被target 和selector占用
             [invocation setArgument:&state atIndex:2];
     //消息调用
             [invocation invoke];
    }```
    ///因为不想改动以前的代码,所以我写了类别来改变屏幕(此处有坑,如果使用UITabBarController也要给UITabBarController的分类添加方法)
    ///查了资料,只需要自定义 UINavigationController就可以实现强制转向,写demo验证的却如此,但引用到项目不行, 强制转向的类还是会收到感应的影响.排查后发现是因为项目使用了UITabBarController,所以要自定义UITabBarController UINavigationController UIViewController 不想更改项目可写category
    //是否允许转向
     -(BOOL)shouldAutorotate{
        return YES;
    }
    //支持的方向
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    //对需要定向的类单独设置
        if ([self.visibleViewController isKindOfClass:[configViewController class]]) {
            return UIInterfaceOrientationMaskLandscapeLeft;//方向设置
        }
        return UIInterfaceOrientationMaskPortrait;
    }
    //如一个页面支持多个方向,这里设置优先方向
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
        return UIInterfaceOrientationLandscapeLeft;
    }
    

    但是这并不能解决的遇到的问题,因为直播如果画面横向的话相机方向也会偏向90度并无法调节,设置transform属性旋转90度也会造成相机方向偏移,尝试无果后只好改变思路,横向布局页面,横向布局只需将控件按照方向旋转即可,造成横屏的假象(如果不使用阿里云直播,使用上面的方法即可)
    阿里云直播如果需要做横竖屏的话,要根据当前手机的感应状态来做相应的适配,这是很坑的一点

    判断手机的感应方向(伪横竖屏切换,只需要设置DeviceOrientation为Portrait)

    //监听手机方向改变
     [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
    //此处对相应的状态做处理
    - (void)handleDeviceOrientationDidChange:(UIInterfaceOrientation)interfaceOrientation
    {
        UIDevice *device = [UIDevice currentDevice] ;
        switch (device.orientation) {
            case UIDeviceOrientationFaceUp:
                NSLog(@"屏幕朝上平躺");
                break;
            case UIDeviceOrientationFaceDown:
                NSLog(@"屏幕朝下平躺");
                break;
            case UIDeviceOrientationUnknown:
                NSLog(@"未知方向");
                break;
            case UIDeviceOrientationLandscapeLeft: {
                NSLog(@"屏幕向左横置");
            }
                break;
            case UIDeviceOrientationLandscapeRight: 
                NSLog(@"屏幕向右横置");
                break;
            case UIDeviceOrientationPortrait: 
            { NSLog(@"屏幕直立");
            }
                break;
            case UIDeviceOrientationPortraitUpsideDown: 
                NSLog(@"  屏幕直立 上下颠倒");
                break;
            default: NSLog(@"无法辨认"); 
                break;
            }
        } 
    //销毁通知
    - (void)dealloc{
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    
     以上是我对横竖屏切换的一些见解,欢迎大家一起讨论. 

    相关文章

      网友评论

          本文标题:iOS 强制横竖屏

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