横屏模式下,如果有需求的话,需要对UI做一套横屏的适配,在此套适配方案中,不需要对预览view做旋转。

例如:如果预览画面是全屏,横屏模式下,则不需要对预览画面的view做任何更改,只需要对页面上其他的如点赞button做一下frame的变化。

注意 目前SDK的横屏推流需要在推流界面的Controller中将iPhone竖屏锁定(即只允许Portrait一个方向),因为推流SDK是对采集到的视频帧做的旋转,不是对view做的旋转。

操作步骤

  1. 检测设备方向。
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];   
  2. 设备方向回调中设置横屏推流还是竖屏推流。
    - (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(@"屏幕向左横置");
             // 横屏推流
             [self destroySession];     // 销毁推流
             // 建议加一个loading  因为销毁推流在重新推流会关闭在重新开启摄像头采集
             _isScreenHorizontal = YES;  // 全局变量  横屏置为YES
             [self testPushCapture];    // 重新推流
         }
             break;
    
         case UIDeviceOrientationLandscapeRight:
             NSLog(@"屏幕向右橫置");
             break;
    
         case UIDeviceOrientationPortrait: {
             NSLog(@"屏幕直立");
             // 竖屏推流
             [self destroySession];     // 销毁推流
             _isScreenHorizontal = NO;  // 全局变量  横屏设置为NO
             [self testPushCapture];    // 重新推流
         }
             break;
    
         case UIDeviceOrientationPortraitUpsideDown:
             NSLog(@"屏幕直立,上下顛倒");
             break;
    
         default:
             NSLog(@"无法辨识");
             break;
     }
    
    }               
  3. 注销设备。
    - (void)dealloc{
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     [[UIDevice currentDevice]endGeneratingDeviceOrientationNotifications];
    }