(Xcode 11.3、Swift 5.1.3 でテスト済み)
UIView を拡張し、UIViewRepresentable でラップして、Swift View として使用したいと考えています。ただし、ラッパーの Swift View からカスタム UIView の拡張機能にアクセスするのは難しいです。
class UICameraCaptureImageView: UIImageView, AVCaptureVideoDataOutputSampleBufferDelegate {
@State var capturedImage: UIImage? = UIImage(named: "default_placeholder")
func startCameraCapture() {
// start camera capture when it is ready
}
// AVCaptureVideoDataOutputSampleBufferDelegate delegate method follows
// ...
}
struct CameraCaptureImageView: UIViewRepresentable {
// cannot set containedUIView in makeUIView/updateUIView, and they are not mutating method
private var containedUIView: UICameraCaptureImageView?
func makeUIView(context: UIViewRepresentableContext<CameraCaptureImageView>) ->
UICapturedImageView {
UICapturedImageView()
}
func updateUIView(_ uiView: UICapturedImageView,
context: UIViewRepresentableContext< CameraCaptureImageView>) {
uiView.image = capturedImage
}
func startCameraCapture() {
// redirect to UICameraCaptureImageView.startCameraCapture(),
// but cannot set self.containedUIView
guard self.containedUIView != nil else {
print("The containedUICaptureView doesn't exist")
return
}
self.containedUIView?.startCameraCapture()
}
}
最初はステートフルな戦略ですが、CameraCaptureImageView にメンバー変数を宣言し、UICameraCaptureImageView のインスタンスを作成時に設定してみました。しかし、ご覧のとおり、makeUIView() は変更メソッドとして宣言されていないため、CameraCaptureImageView のメンバーを変更することはできません。
UIViewRepresentable ラッパーから UIView サブクラスの拡張カスタム関数 startCameraCapture() にアクセスするにはどうすればよいですか? または、SwiftUI で拡張された古い UIView を使用するステートレスで適切なソリューションはありますか?