首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIViewRepresentable视图的AVFoundation旋转

UIViewRepresentable视图的AVFoundation旋转
EN

Stack Overflow用户
提问于 2022-05-10 12:22:46
回答 1查看 261关注 0票数 0

我使用CameraPreview (UIViewRepresentable)作为UIKitSwiftUI之间的桥梁。CameraPreview使用CameraModel进行配置,并使用AVCaptureVideoPreviewLayerCameraModel正在配置AVCaptureSessionAVCaptureDeviceInput。除了我尝试在iPad上旋转设备之外,一切都很好。CameraPreview没有正确地旋转,并且使用以前旋转的输入。(下图)我可以检查SwiftUI (基于本文)中正在旋转的设备,但是我不知道如何重新配置CameraPreviewAVCaptureVideoPreviewLayer的旋转。知道在我发现设备被旋转后如何在UIKit中触发布局更新吗?

代码如下:

代码语言:javascript
复制
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)
        }
    }
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-29 16:09:51

我通过以下方式解决了这一问题:

  1. 使预览框架适应bounds而不是frame
  2. 当我在某些superview 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 }
  3. 手动在AVCaptureVideoOrientation上设置AVCaptureConnection以纠正设备方向。每当我检测到方向变化时,我都会这样做: previewConnection.videoPreviewLayer?.connection?.videoOrientation = orientation.videoOrientation
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72186243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档