62 lines
2.1 KiB
Swift
62 lines
2.1 KiB
Swift
|
//
|
||
|
// CameraView+Orientation.swift
|
||
|
// VisionCamera
|
||
|
//
|
||
|
// Created by Marc Rousavy on 04.01.22.
|
||
|
// Copyright © 2022 mrousavy. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
import UIKit
|
||
|
|
||
|
extension CameraView {
|
||
|
/// Returns the current _interface_ orientation of the main window
|
||
|
private var windowInterfaceOrientation: UIInterfaceOrientation {
|
||
|
if #available(iOS 13.0, *) {
|
||
|
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation ?? .unknown
|
||
|
} else {
|
||
|
return UIApplication.shared.statusBarOrientation
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// Orientation of the input connection (preview)
|
||
|
private var inputOrientation: UIInterfaceOrientation {
|
||
|
return windowInterfaceOrientation
|
||
|
}
|
||
|
|
||
|
// Orientation of the output connections (photo, video, frame processor)
|
||
|
private var outputOrientation: UIInterfaceOrientation {
|
||
|
if let userOrientation = orientation as String?,
|
||
|
let parsedOrientation = try? UIInterfaceOrientation(withString: userOrientation) {
|
||
|
// user is overriding output orientation
|
||
|
return parsedOrientation
|
||
|
} else {
|
||
|
// use same as input orientation
|
||
|
return inputOrientation
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal func updateOrientation() {
|
||
|
// Updates the Orientation for all rotable connections (outputs) as well as for the preview layer
|
||
|
DispatchQueue.main.async {
|
||
|
// `windowInterfaceOrientation` and `videoPreviewLayer` should only be accessed from UI thread
|
||
|
let isMirrored = self.videoDeviceInput?.device.position == .front
|
||
|
|
||
|
self.videoPreviewLayer.connection?.setInterfaceOrientation(self.inputOrientation)
|
||
|
|
||
|
self.cameraQueue.async {
|
||
|
// Run those updates on cameraQueue since they can be blocking.
|
||
|
self.captureSession.outputs.forEach { output in
|
||
|
output.connections.forEach { connection in
|
||
|
if connection.isVideoMirroringSupported {
|
||
|
connection.automaticallyAdjustsVideoMirroring = false
|
||
|
connection.isVideoMirrored = isMirrored
|
||
|
}
|
||
|
connection.setInterfaceOrientation(self.outputOrientation)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|