简体   繁体   English

UIViewRepresentable 中 SwiftUI 中的 AVSampleBufferDisplayLayer

[英]AVSampleBufferDisplayLayer in SwiftUI in UIViewRepresentable

I want to add AVSampleBufferDisplayLayer in top if my UIImageView but I need access to that AVSampleBufferDisplayLayer as a property.我想在顶部添加 AVSampleBufferDisplayLayer 如果我的 UIImageView 但我需要访问该 AVSampleBufferDisplayLayer 作为属性。 The Error self is not immutable is shown.错误自我不是一成不变的显示。


struct CamerImageSUIView: UIViewRepresentable {
    
    internal lazy var cameraAVLayer: AVSampleBufferDisplayLayer = {
        let avLayer = AVSampleBufferDisplayLayer()
        avLayer.videoGravity = .resizeAspectFill
        return avLayer
    }()

    func makeUIView(context: Context)  -> ImageLoaderView {
        let imageView = ImageLoaderView()
        imageView.ribbonMode = false
        imageView.event = false
        imageView.tintColor = UIColor(named: "ColorC5")
        imageView.backgroundColor = UIColor(named: "ColorC3")
        imageView.contentMode = .scaleToFill

        //HERE IS THE PROBLEM BECAUSE cameraAVLayer is immutable
        imageView.layer.insertSublayer(cameraAVLayer, at: 0)
        cameraAVLayer.frame = imageView.layer.bounds

        return imageView
    }

    func updateUIView(_ uiView: ImageLoaderView, context: Context) {}
    
    
}

I had a similar issue with my app, and came up with the following implementation.我的应用程序遇到了类似的问题,并提出了以下实现。

  1. Created a model object, which has a displayLayer property.创建了一个具有 displayLayer 属性的模型对象。
class CameraImageState: ObservableObject {
    let displayLayer = AVSampleBufferDisplayLayer()
}
  1. When I create a view, I give the reference to this model object (or the displayLayer property)当我创建一个视图时,我会引用这个模型对象(或 displayLayer 属性)
struct CamerImageSUIView: UIViewRepresentable {
    @ObservedObject var state: CameraImageState
    
    func makeUIView(context: Context)  -> ImageLoaderView {
        let imageView = ImageLoaderView()
        imageView.ribbonMode = false
        imageView.event = false
        imageView.tintColor = UIColor(named: "ColorC5")
        imageView.backgroundColor = UIColor(named: "ColorC3")
        imageView.contentMode = .scaleToFill

        state.displayLayer.videoGravity = .resizeAspectFill
        state.displayLayer.frame = imageView.layer.bounds
        imageView.layer.insertSublayer(state.displayLayer, at: 0)

        return imageView
    }

    func updateUIView(_ uiView: ImageLoaderView, context: Context) {}
}

By the way, (even though I haven't modified your code) it does not make sense to set the frame of displayLayer in makeUIView, because it will change later anyway.顺便说一句,(即使我没有修改你的代码)在 makeUIView 中设置 displayLayer 的框架没有意义,因为它无论如何都会改变。 You need to do it in layoutsubviews() of ImageLoaderView.您需要在 ImageLoaderView 的 layoutsubviews() 中执行此操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM