簡體   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