fix: Fix basic Orientation on iOS (#2000)

* fix: Fix basic Orientation on iOS

* ci: Use macOS 13 runner for latest Xcode 15

* chore: Remove Xcode 15 checks

* Format
This commit is contained in:
Marc Rousavy 2023-10-14 13:17:14 +02:00 committed by GitHub
parent fab5bdc0cd
commit ea98112a21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 38 additions and 38 deletions

View File

@ -21,7 +21,7 @@ on:
jobs:
build:
name: Build iOS Example App
runs-on: macOS-latest
runs-on: macOS-13
defaults:
run:
working-directory: package/example/ios
@ -80,7 +80,7 @@ jobs:
build-no-frame-processors:
name: Build iOS Example App without Frame Processors
runs-on: macOS-latest
runs-on: macOS-13
defaults:
run:
working-directory: package/example/ios

View File

@ -27,7 +27,7 @@ jobs:
env:
WORKING_DIRECTORY: ios
SwiftFormat:
runs-on: macOS-latest
runs-on: macOS-13
defaults:
run:
working-directory: ./package/ios

View File

@ -39,17 +39,12 @@ class CameraDevicesManager: RCTEventEmitter {
override func constantsToExport() -> [AnyHashable: Any]! {
let devices = getDevicesJson()
let preferredDevice: [String: Any]?
// TODO: Remove this #if once Xcode 15 is rolled out
#if swift(>=5.9)
if #available(iOS 17.0, *),
let userPreferred = AVCaptureDevice.userPreferredCamera {
preferredDevice = userPreferred.toDictionary()
} else {
preferredDevice = devices.first
}
#else
preferredDevice = devices.first
#endif
return [
"availableCameraDevices": devices,

View File

@ -30,23 +30,22 @@ extension AVCaptureOutput {
- For Videos, the buffers are physically rotated if available, since we use an AVCaptureVideoDataOutput instead of an AVCaptureMovieFileOutput.
*/
func setOrientation(_ orientation: Orientation) {
// Camera Sensors are always in 90deg rotation.
// We are setting the target rotation here, so we need to rotate by 90deg once.
let cameraOrientation = orientation.rotateRight()
// Set orientation for each connection
connections.forEach { connection in
// TODO: Use this once Xcode 15 is rolled out
// if #available(iOS 17.0, *) {
// let degrees = cameraOrientation.toDegrees()
// if connection.isVideoRotationAngleSupported(degrees) {
// connection.videoRotationAngle = degrees
// }
// } else {
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()
if connection.isVideoRotationAngleSupported(degrees) {
connection.videoRotationAngle = degrees
}
} else {
if connection.isVideoOrientationSupported {
connection.videoOrientation = cameraOrientation.toAVCaptureVideoOrientation()
}
// }
connection.videoOrientation = orientation.toAVCaptureVideoOrientation()
}
}
}
}
}

View File

@ -38,6 +38,19 @@ enum Orientation: String, JSUnionValue {
}
}
init(degrees: Double) {
switch degrees {
case 45 ..< 135:
self = .landscapeLeft
case 135 ..< 225:
self = .portraitUpsideDown
case 225 ..< 315:
self = .landscapeRight
default:
self = .portrait
}
}
var jsValue: String {
return rawValue
}
@ -68,16 +81,9 @@ enum Orientation: String, JSUnionValue {
}
}
func rotateRight() -> Orientation {
switch self {
case .portrait:
return .landscapeLeft
case .landscapeLeft:
return .portraitUpsideDown
case .portraitUpsideDown:
return .landscapeRight
case .landscapeRight:
return .portrait
}
func rotateBy(orientation: Orientation) -> Orientation {
let added = toDegrees() + orientation.toDegrees()
let degress = added.truncatingRemainder(dividingBy: 360)
return Orientation(degrees: degress)
}
}