から削除する前にブール値を変更する必要があると思いますが、構造体のプロパティを変更できないため、方法が見つかりません。UIRepresentableView
ContentView
なぜそれが必要なのですか?updateUIView()
ビューが解放される前に、最後にもう一度呼び出されないようにする必要があるためです。
おそらくこれは XY の問題です...とにかく、私は迷っています。
私はこのようなモデルを持っています:
class PlayerModel: NSObject, ObservableObject {
@Published var lottie: [LottieView]
これはどこですかLottieView
:
struct LottieView: UIViewRepresentable {
var name: String
var loopMode: LottieLoopMode = .playOnce
func makeUIView(context: UIViewRepresentableContext<LottieView>) -> UIView {
let view = UIView()
return view
}
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<LottieView>) {
uiView.subviews.forEach({ sub in
sub.removeFromSuperview()
})
let animationView = AnimationView()
animationView.translatesAutoresizingMaskIntoConstraints = false
uiView.addSubview(animationView)
NSLayoutConstraint.activate([
animationView.widthAnchor.constraint(equalTo: uiView.widthAnchor),
animationView.heightAnchor.constraint(equalTo: uiView.heightAnchor)
])
animationView.animation = Animation.named(name, animationCache: LRUAnimationCache.sharedCache)
animationView.contentMode = .scaleAspectFit
animationView.loopMode = loopMode
animationView.play()
}
}
私の場合、公開された配列に最近のものがContentView
ある場合にのみ表示します。LottieView
struct ContentView: View {
@ObservedObject var model: PlayerModel
var body: some View {
NavigationView {
VStack {
// ...
if let lottie = model.lottie.last {
lottie
}
// ...
}
}
}
}
LottieView
これで問題なく動作しますが、モデルでパブリッシュされた配列から最後を削除すると、 updateUIView()
func が SwiftUI によって最後に呼び出さLottieView
れ、ビューから削除される直前にアニメーションが再作成され、ちらつきが表示されます。 .
だから私LottieView
は公開された配列から最後のものを削除する直前に更新できるブール値を追加し、で if/else を実行すると思いましたupdateUIView()
が...これは可能ですか? 方法が見つかりません。
理想的には、アニメーション ビューを作成しmakeUIView()
て何も行わないことですupdateUIView()
が、これは不可能です。最初にサブビューを削除する必要があります。そうしないと、以前に表示されたアニメーションが新しいものに置き換えられません。