From 5bc9c7e36915a11e4f0ce95de43968e9b4f2cbe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E5=BE=B7?= Date: Thu, 16 Oct 2025 13:38:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(ios):=20=E4=BF=AE=E5=A4=8D=E6=91=84?= =?UTF-8?q?=E5=83=8F=E5=A4=B4=E6=96=B9=E5=90=91=E5=9C=A8=20iOS=2013+=20?= =?UTF-8?q?=E4=B8=8A=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加辅助方法获取当前界面方向并转换为摄像头方向,兼容 iOS 13+ 的新 API --- .gitignore | 1 + src/ios/CDVBarcodeScanner.mm | 41 ++++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c138f46 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.history/ \ No newline at end of file diff --git a/src/ios/CDVBarcodeScanner.mm b/src/ios/CDVBarcodeScanner.mm index 33e6130..b0c719e 100644 --- a/src/ios/CDVBarcodeScanner.mm +++ b/src/ios/CDVBarcodeScanner.mm @@ -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; + } } //--------------------------------------------------------------------------