在 MacOS 中使用 AVCaptureVideoPreviewLayer 的问题

Problems using AVCaptureVideoPreviewLayer in MacOS

我一直在尝试按照 tutorial 嵌入 AVCaptureVideoPreviewLayer(或者更简单地说,使用相机的非常基本的取景器),但在转换 iOS 代码以适应我的 MacOS 时遇到了问题申请。

当我尝试转换此代码块时出现问题:

// setting view for preview...

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 Properties...
        camera.preview.videoGravity = .resizeAspectFill
        view.layer.addSublayer(camera.preview)
        
        // starting session
        camera.session.startRunning()
        
        return view
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
        
    }
}

我的理解是 UIViews 仅用于 iOS 开发MacOS 使用 NSViews 而不是 。知道这一点后,我尽力提出以下修改后的代码

// setting view for preview...

struct CameraPreview: NSViewRepresentable {  // ERROR #1
    
    @ObservedObject var camera : CameraModel
    
    func makeNSView(context: Context) ->  NSView {
     
        let view = NSView(frame: CGRect(origin: .zero,
                                        size: CGSize(width: 200, height: 200)))
        
        camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
        camera.preview.frame = view.frame
        
        // Your Own Properties...
        camera.preview.videoGravity = .resizeAspectFill
        view.addSubview(camera.preview)   //ERROR #2
        
        // starting session
        camera.session.startRunning()
        
        return view
    }
    
    func updateUIView(_ uiView: NSView, context: NSView) {
        
    }
}

问题是:

  1. 类型 'CameraPreview' 不符合协议 'NSViewRepresentable'(错误 #1)
  2. 无法将类型 'AVCaptureVideoPreviewLayer' 的值转换为预期的参数类型 'NSView'(错误 #2)

感谢您的帮助!我是一名中级 iOS 开发人员,但一直在努力培养我在 MacOS 开发方面的技能。

您忘记更新这部分内容updateUIView

    func updateNSView(_ uiView: NSView, context: Context) {    // << here !!
        
    }

大约第二个...您尝试将图层添加到视图,但应将布局添加到图层,例如

    let view = NSView(frame: CGRect(origin: .zero,
                                    size: CGSize(width: 200, height: 200)))

    view.wantsLayer = true   // needed explicitly for NSView

    ...

    view.layer.addSublayer(camera.preview)