fix preview and recording orientation fix
- add onCameraConfigurationChanged to CameraSessionDelegate to notify CameraView when configuration changes - when orientatin change update CameraView.PreviewView.videoPreviewLayer.connection orientation value
This commit is contained in:
		| @@ -304,6 +304,15 @@ public final class CameraView: UIView, CameraSessionDelegate { | ||||
|     onInitialized([:]) | ||||
|   } | ||||
|    | ||||
|   func onCameraConfigurationChanged(_ configuration: CameraConfiguration?, _ difference: CameraConfiguration.Difference?) { | ||||
|     guard let configuration, let difference else { return } | ||||
|      | ||||
|     if difference.orientationChanged, let connection = previewView.videoPreviewLayer.connection { | ||||
|       let videoPreviewLayer = previewView.videoPreviewLayer | ||||
|       connection.setOrientation(configuration.orientation) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   func onCameraStarted() { | ||||
|     ReactLogger.log(level: .info, message: "Camera started!") | ||||
|     guard let onStarted = onStarted else { | ||||
|   | ||||
| @@ -195,6 +195,7 @@ class CameraSession: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate, AVC | ||||
|           self.delegate?.onSessionInitialized() | ||||
|         } | ||||
|  | ||||
|         self.delegate?.onCameraConfigurationChanged(config, difference) | ||||
|         // After configuring, set this to the new configuration. | ||||
|         self.configuration = config | ||||
|       } catch { | ||||
|   | ||||
| @@ -21,6 +21,8 @@ protocol CameraSessionDelegate: AnyObject { | ||||
|    Called when the [CameraSession] successfully initializes | ||||
|    */ | ||||
|   func onSessionInitialized() | ||||
|    | ||||
|   func onCameraConfigurationChanged(_ configuration: CameraConfiguration?, _ difference: CameraConfiguration.Difference?) | ||||
|   /** | ||||
|    Called when the [CameraSession] starts streaming frames. (isActive=true) | ||||
|    */ | ||||
|   | ||||
| @@ -32,28 +32,36 @@ extension AVCaptureOutput { | ||||
|   func setOrientation(_ orientation: Orientation) { | ||||
|     // Set orientation for each connection | ||||
|     for connection in connections { | ||||
|       #if swift(>=5.9) | ||||
|         if #available(iOS 17.0, *) { | ||||
|           // Camera Sensors are always in landscape rotation (90deg). | ||||
|           // We are setting the target rotation here, so we need to rotate by landscape once. | ||||
|           let cameraOrientation = orientation.rotateBy(orientation: .landscapeLeft) | ||||
|           let degrees = cameraOrientation.toDegrees() | ||||
|  | ||||
|           // TODO: Don't rotate the video output because it adds overhead. Instead just use EXIF flags for the .mp4 file if recording. | ||||
|           //       Does that work when we flip the camera? | ||||
|           if connection.isVideoRotationAngleSupported(degrees) { | ||||
|             connection.videoRotationAngle = degrees | ||||
|           } | ||||
|         } else { | ||||
|           if connection.isVideoOrientationSupported { | ||||
|             connection.videoOrientation = orientation.toAVCaptureVideoOrientation() | ||||
|           } | ||||
|         } | ||||
|       #else | ||||
|         if connection.isVideoOrientationSupported { | ||||
|           connection.videoOrientation = orientation.toAVCaptureVideoOrientation() | ||||
|         } | ||||
|       #endif | ||||
|       connection.setOrientation(orientation) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| extension AVCaptureConnection { | ||||
|   func setOrientation(_ orientation: Orientation) { | ||||
|     #if swift(>=5.9) | ||||
|       if #available(iOS 17.0, *) { | ||||
|         // Camera Sensors are always in landscape rotation (90deg). | ||||
|         // We are setting the target rotation here, so we need to rotate by landscape once. | ||||
|         let cameraOrientation = orientation.rotateBy(orientation: .landscapeLeft) | ||||
|         let degrees = cameraOrientation.toDegrees() | ||||
|  | ||||
|         // TODO: Don't rotate the video output because it adds overhead. Instead just use EXIF flags for the .mp4 file if recording. | ||||
|         //       Does that work when we flip the camera? | ||||
|         if isVideoRotationAngleSupported(degrees) { | ||||
|           videoRotationAngle = degrees | ||||
|         } | ||||
|       } else { | ||||
|         if isVideoOrientationSupported { | ||||
|           videoOrientation = orientation.toAVCaptureVideoOrientation() | ||||
|         } | ||||
|       } | ||||
|     #else | ||||
|       if isVideoOrientationSupported { | ||||
|         videoOrientation = orientation.toAVCaptureVideoOrientation() | ||||
|       } | ||||
|     #endif | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -113,5 +113,19 @@ class ViewController: UIViewController { | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   override func viewWillTransition(to size: CGSize, with coordinator: any UIViewControllerTransitionCoordinator) { | ||||
|     switch UIDevice.current.orientation { | ||||
|     case .landscapeLeft: | ||||
|       cameraView.orientation = "landscape-right" | ||||
|     case .landscapeRight: | ||||
|       cameraView.orientation = "landscape-left" | ||||
|     default: | ||||
|       cameraView.orientation = "portrait" | ||||
|     } | ||||
|      | ||||
|     cameraView.didSetProps([]) | ||||
|     super.viewWillTransition(to: size, with: coordinator) | ||||
|   } | ||||
|    | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user