繁体   English   中英

UIViewRepresentable 中 SwiftUI 中的 AVSampleBufferDisplayLayer

[英]AVSampleBufferDisplayLayer in SwiftUI in UIViewRepresentable

我想在顶部添加 AVSampleBufferDisplayLayer 如果我的 UIImageView 但我需要访问该 AVSampleBufferDisplayLayer 作为属性。 错误自我不是一成不变的显示。


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) {}
    
    
}

我的应用程序遇到了类似的问题,并提出了以下实现。

  1. 创建了一个具有 displayLayer 属性的模型对象。
class CameraImageState: ObservableObject {
    let displayLayer = AVSampleBufferDisplayLayer()
}
  1. 当我创建一个视图时,我会引用这个模型对象(或 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) {}
}

顺便说一句,(即使我没有修改你的代码)在 makeUIView 中设置 displayLayer 的框架没有意义,因为它无论如何都会改变。 您需要在 ImageLoaderView 的 layoutsubviews() 中执行此操作。

暂无
暂无

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

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