iOS 屏幕旋转的实践解析( 三 )


(void)setupNotification {[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(applicationWillResignActive:)name:UIApplicationWillResignActiveNotification object:nil];[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(applicationDidBecomeActive:)name:UIApplicationDidBecomeActiveNotification object:nil];}- (BOOL)shouldAutorotate {if (!self.isApplicationActive) {return NO;} else {return YES;}}} 
 
 
 
问题四:屏幕旋转与 ZegoExpressEngine 的适配有很多小伙伴已经接入了我们的 ZegoExpressEngine 实时音视频引擎,那么在旋转的场景中你就要考虑到旋转对推拉流的影响,以 RoomKit SDK 的使用场景为例 , 大致有以下几种情况:
 
当前页面固定一个方向显示,只需要设置与当前方向符合的视频分辨率(引擎默认值为 “360 × 640”,根据自己需求确定),再调用引擎的 setAppOrientation 接口设置当前方向 , 以下代码以左横屏方向为例:
ZegoVideoConfig *videoConfig = [[ZegoVideoConfig alloc] init];// 左横屏分辨率设置如下:videoConfig.encodeResolution = CGSizeMake(1280, 720);[[ZegoExpressEngine sharedEngine] setVideoConfig:videoConfig];// 调用 setAppOrientation 接口设置视频的朝向[[ZegoExpressEngine sharedEngine] setAppOrientation:UIInterfaceOrientationLandscapeLeft]; 
 
 
当前页面有旋转的场景 , 这时就需要在旋转完成后去更新 ZegoExpressEngine 引擎的方向和视频分辨率,注意这里的当前方向取的是当前状态栏的方向 。
// 根据当前方向设置分辨率ZegoVideoConfig *videoConfig = [ZegoVideoConfig defaultConfig];if (isCurPortrait) {videoConfig.captureResolution = CGSizeMake(720, 1280);} else {videoConfig.captureResolution = CGSizeMake(1280, 720);}// 调用 setAppOrientation 接口设置视频的朝向[[ZegoExpressEngine sharedEngine] setAppOrientation:[UIApplication sharedApplication].statusBarOrientation]; 
 
 
上面的 ZegoExpressEngine 音视频引擎屏幕旋转后的适配逻辑,处理时机都在视图控制器旋转完成后,也就是 viewWillTransitionToSize 方法的 completion block 里面,这时拿到的 [UIApplication sharedApplication].statusBarOrientation 方向与当前控制器方向符合 。
(更多 ZegoExpressEngine 音视频引擎屏幕旋转问题可以参考: iOS 实时音视频SDK视频旋转功能- 开发者中心 - ZEGO即构科技)
四、相关枚举值在前面的讲述中,我们也认识了一些与屏幕旋转相关的枚举值 。乍一看这块内容确实会感觉多得让人眼花缭乱,但是我们看清楚他们名称中的关键词如:Device、Interface , 并在各个枚举类型用到的地方去理解它的意思,也是能理清这里面的逻辑的 。
 
1、 设备方向:UIDeviceOrientationUIDeviceOrientation 是以 home 键的位置作为参照,受传感器影响,和当前屏幕显示的方向无关 , 所以只能取值不能设值 。
 
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {UIInterfaceOrientationUnknown= UIDeviceOrientationUnknown,UIInterfaceOrientationPortrait= UIDeviceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft= UIDeviceOrientationLandscapeRight,UIInterfaceOrientationLandscapeRight= UIDeviceOrientationLandscapeLeft} API_UNAVAILABLE(tvos); 前面讲述的屏幕旋转方法中不会直接用到这个枚举,但是如果你有监听设备当前方向的需求时,它就变得有用了 。可以通过 [UIDevice currentDevice].orientation 获取当前设备的方向,若要监听设备的方向变化,可以用以下代码实现:
 
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:observerselector:@selector(onDeviceOrientationChange:)name:UIDeviceOrientationDidChangeNotificationobject:nil];  
2、 页面方向:UIInterfaceOrientationUIInterfaceOrientation 是当前视图控制器的方向,区别于设备方向,它是屏幕正在显示的方向,preferredInterfaceOrientationForPresentation 方法的返回值就是这个枚举类型 。
 
/// 优先的屏幕方向- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return UIInterfaceOrientationPortrait;}注意 UIInterfaceOrientationLandscapeLeft 与 UIDeviceOrientationLandscapeRight 是对应的 , 这两个枚举类型左右相反 。
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {UIInterfaceOrientationUnknown= UIDeviceOrientationUnknown,UIInterfaceOrientationPortrait= UIDeviceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft= UIDeviceOrientationLandscapeRight,UIInterfaceOrientationLandscapeRight= UIDeviceOrientationLandscapeLeft} API_UNAVAILABLE(tvos);


推荐阅读