fix(ios): 修复摄像头方向在 iOS 13+ 上的兼容性问题

添加辅助方法获取当前界面方向并转换为摄像头方向,兼容 iOS 13+ 的新 API
This commit is contained in:
大德
2025-10-16 13:38:19 +08:00
parent 4de470201a
commit 5bc9c7e369
2 changed files with 40 additions and 2 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.history/

View File

@@ -784,21 +784,58 @@ prompt:(NSString *)prompt {
//--------------------------------------------------------------------------
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated]; // 建议先调用 super符合规范
// setup capture preview layer
AVCaptureVideoPreviewLayer* previewLayer = self.processor.previewLayer;
previewLayer.frame = self.view.bounds;
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
if ([previewLayer.connection isVideoOrientationSupported]) {
[previewLayer.connection setVideoOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
// 1. 获取当前界面方向(兼容 iOS 13+
UIInterfaceOrientation interfaceOrientation = [self currentInterfaceOrientation];
// 2. 转换为相机需要的方向类型
AVCaptureVideoOrientation captureOrientation = [self convertToCaptureOrientation:interfaceOrientation];
// 3. 设置方向
[previewLayer.connection setVideoOrientation:captureOrientation];
}
[self.view.layer insertSublayer:previewLayer below:[[self.view.layer sublayers] objectAtIndex:0]];
[self.view addSubview:[self buildOverlayView]];
[self startCapturing];
}
[super viewDidAppear:animated];
#pragma mark - 辅助方法:获取当前界面方向(兼容 iOS 13+
- (UIInterfaceOrientation)currentInterfaceOrientation {
if (@available(iOS 13.0, *)) {
// iOS 13+ 用 windowScene 获取方向statusBarOrientation 已废弃)
UIWindowScene *windowScene = [UIApplication sharedApplication].windows.firstObject.windowScene;
return windowScene.interfaceOrientation;
} else {
// iOS 12 及以下用 statusBarOrientation
return [UIApplication sharedApplication].statusBarOrientation;
}
}
#pragma mark - 辅助方法:将 UIInterfaceOrientation 转为 AVCaptureVideoOrientation
- (AVCaptureVideoOrientation)convertToCaptureOrientation:(UIInterfaceOrientation)interfaceOrientation {
switch (interfaceOrientation) {
case UIInterfaceOrientationPortrait:
return AVCaptureVideoOrientationPortrait;
case UIInterfaceOrientationPortraitUpsideDown:
return AVCaptureVideoOrientationPortraitUpsideDown;
case UIInterfaceOrientationLandscapeLeft:
// 注意:界面左横屏对应相机右横屏(镜像关系)
return AVCaptureVideoOrientationLandscapeRight;
case UIInterfaceOrientationLandscapeRight:
// 注意:界面右横屏对应相机左横屏(镜像关系)
return AVCaptureVideoOrientationLandscapeLeft;
case UIInterfaceOrientationUnknown:
default:
// 未知方向默认竖屏
return AVCaptureVideoOrientationPortrait;
}
}
//--------------------------------------------------------------------------