如何用新API修复iOS屏幕方向?替换废弃的willAnimateRotationToInterfaceOrientation方法
嘿,刚好处理过类似的摄像头预览旋转适配问题,你原来用的willAnimateRotationToInterfaceOrientation:确实在iOS 8之后就被废弃了,给你整理下用新API修复的完整方案:
核心替换:用viewWillTransitionToSize:withTransitionCoordinator:替代废弃方法
这个新方法会在界面即将旋转时被调用,还能和系统旋转动画同步执行自定义逻辑,完美适配旧方法的使用场景。
在你的ViewController中重写这个方法:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; // 绑定系统旋转动画,保证摄像头预览旋转和界面同步 [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { // 获取当前界面方向 UIInterfaceOrientation currentOrientation = [self currentInterfaceOrientation]; if (self.previewLayer && self.previewLayer.connection.isVideoOrientationSupported) { self.previewLayer.connection.videoOrientation = [self convertToCaptureOrientation:currentOrientation]; } } completion:nil]; }
适配iOS 13+的方向获取逻辑
iOS 13之后[UIApplication sharedApplication].statusBarOrientation也被废弃了,需要兼容新旧系统的方向获取方式:
- (UIInterfaceOrientation)currentInterfaceOrientation { if (@available(iOS 13.0, *)) { // iOS 13+ 通过windowScene获取方向 return self.view.window.windowScene.interfaceOrientation; } else { // iOS 12及以下用statusBarOrientation return [[UIApplication sharedApplication] statusBarOrientation]; } }
界面方向转摄像头捕获方向的辅助方法
注意:UI界面方向和AVCapture的视频方向枚举有个小差异——左右横屏是相反的,需要做转换:
- (AVCaptureVideoOrientation)convertToCaptureOrientation:(UIInterfaceOrientation)orientation { switch (orientation) { case UIInterfaceOrientationPortrait: return AVCaptureVideoOrientationPortrait; case UIInterfaceOrientationLandscapeLeft: // 界面左横屏对应摄像头的右横屏 return AVCaptureVideoOrientationLandscapeRight; case UIInterfaceOrientationLandscapeRight: // 界面右横屏对应摄像头的左横屏 return AVCaptureVideoOrientationLandscapeLeft; case UIInterfaceOrientationPortraitUpsideDown: return AVCaptureVideoOrientationPortraitUpsideDown; default: return AVCaptureVideoOrientationPortrait; } }
几个关键注意点
- 一定要检查
previewLayer.connection.isVideoOrientationSupported:避免某些设备或摄像头不支持方向调整导致崩溃 - 用
animateAlongsideTransition:包裹逻辑:让摄像头旋转动画和系统界面旋转动画完全同步,不会出现卡顿或错位 - 如果你的VC嵌套在导航控制器或tabBar控制器中,要确保父控制器的旋转设置正确,子VC才能接收到旋转回调
这样替换之后,就能完美替代原来的废弃方法,解决屏幕旋转时摄像头预览的方向问题了。
内容的提问来源于stack exchange,提问作者ddwdwwf drewret
相关产品推荐
相关产品推荐

