0

から削除する前にブール値を変更する必要があると思いますが、構造体のプロパティを変更できないため、方法が見つかりません。UIRepresentableViewContentView

なぜそれが必要なのですか?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()が、これは不可能です。最初にサブビューを削除する必要があります。そうしないと、以前に表示されたアニメーションが新しいものに置き換えられません。

4

1 に答える 1