(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);
推荐阅读
- cdr能咋样旋转,coreldraw如何水平翻转然后复制
- 爱奇艺为什么不能屏幕共享 爱奇艺为什么不能屏幕共享会员
- ubuntu怎么进入bios
- 怎么设置音量键唤醒屏幕,小米手机如何使用音量键点亮屏幕
- 华为p40pro+屏幕测评 华为p40pro换屏幕多少钱
- 电脑屏幕花屏横条纹闪是什么原因 电脑屏幕花屏横条纹闪过一会就好了
- cdr能怎么样旋转,CDR如何翻转文件
- cdr里做图的轮廓,cdr能怎么样旋转复制
- cdr旋转应该怎么样操作
- 华为屏幕锁定设置方法,华为手机屏幕锁怎么设置密码