You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:35:08