[英]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.我的应用程序遇到了类似的问题,并提出了以下实现。
class CameraImageState: ObservableObject {
let displayLayer = AVSampleBufferDisplayLayer()
}
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.