iOS 强制横竖屏

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


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

在需要改变屏幕方向的类使用这个方法 (需要设置DeviceOrientation方向)
iOS 强制横竖屏_第1张图片
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 强制横竖屏)