我使用CameraPreview (UIViewRepresentable)作为UIKit和SwiftUI之间的桥梁。CameraPreview使用CameraModel进行配置,并使用AVCaptureVideoPreviewLayer。CameraModel正在配置AVCaptureSession和AVCaptureDeviceInput。除了我尝试在iPad上旋转设备之外,一切都很好。CameraPreview没有正确地旋转,并且使用以前旋转的输入。(下图)我可以检查SwiftUI (基于本文)中正在旋转的设备,但是我不知道如何重新配置CameraPreview和AVCaptureVideoPreviewLayer的旋转。知道在我发现设备被旋转后如何在UIKit中触发布局更新吗?
代码如下:
struct CameraView: View {
@StateObject var camera = CameraModel()
var body: some View {
CameraPreview(camera: camera)
.ignoresSafeArea(.all, edges: .all)
}
}
struct CameraPreview: UIViewRepresentable {
@ObservedObject var camera: CameraModel
func makeUIView(context: Context) -> UIView {
let view = UIView(frame: UIScreen.main.bounds)
camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
camera.preview.frame = view.frame
//your own properies
camera.preview.videoGravity = .resizeAspectFill
view.layer.addSublayer(camera.preview)
//starting session
camera.session.startRunning()
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) { }
}
class CameraModel: NSObject, ObservableObject, AVCapturePhotoCaptureDelegate {
@Published var session = AVCaptureSession()
@Published var preview: AVCaptureVideoPreviewLayer!
@Published var output = AVCapturePhotoOutput()
func setUp() {
do {
self.session.beginConfiguration()
let device = AVCaptureDevice.default(for: .video)
let input = try AVCaptureDeviceInput(device:device!)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
if self.session.canAddOutput(self.output) {
self.session.addOutput(self.output)
}
self.session.commitConfiguration()
}catch {
print(error.localizedDescription)
}
}
}


发布于 2022-05-29 16:09:51
我通过以下方式解决了这一问题:
bounds而不是frame。View上检测到设备方向的变化时,我改变了deviceRotation变量的值,这会自动触发updateUIView函数。
struct CameraPreview: UIViewRepresentable { @ObservedObject var摄像机: CameraModel var deviceRotation: UIDeviceOrientation func makeUIView(上下文:上下文) -> UIView { let view = UIView(frame: UIScreen.main.bounds) camera.preview =AVCaptureVideoPreviewLayer(会话: camera.session) camera.preview.frame = view.bounds //您自己的属性camera.preview.videoGravity = .resizeAspectFill view.layer.addSublayer(view.bounds)//启动会话()返回updateUIView(_ uiView: UIViewType,上下文:上下文){ let view =UIView(框架: UIScreen.main.bounds) camera.preview.frame = view.bounds }AVCaptureVideoOrientation上设置AVCaptureConnection以纠正设备方向。每当我检测到方向变化时,我都会这样做:
previewConnection.videoPreviewLayer?.connection?.videoOrientation = orientation.videoOrientationhttps://stackoverflow.com/questions/72186243
复制相似问题