Come disabilitare l'animazione nell'elenco quando gli oggetti osservati cambiano in SwiftUI?


15

Come disabilitare l'animazione quando si modificano i dati di visualizzazione del modello?

Ho il codice seguente:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

    var body: some View {
        List {
            ForEach(viewModel.options) { option in
                Text(option.displayValue)
            }
        }
    }
}

Ogni volta che le modifiche al modello di visualizzazione Listvengono aggiornate con l'animazione.
Come posso disabilitarlo?
Ho provato ad aggiungere .animation(nil)ma non aiuta

Risposte:


1

La soluzione alternativa fino a quando Apple non ci fornisce una modifica per farlo su List è Call List.id (_ :) Cambia lo stato interno di List e forza la List a ricreare immediatamente, senza alcuna animazione. Per i dettagli, consultare Elenco per ricaricare anomalie dell'animazione

Lo stesso potrebbe essere fatto su qualsiasi View (func id () fa parte del protocollo View), ma devi sapere che tutte le variabili di stato avranno lo stato "default" iniziale, quindi usalo attentamente. È lo stesso di "ricreare" la vista.

Per essere in grado di capire come funziona, vedere https://swiftui-lab.com/swiftui-id/


1

La soluzione che ho trovato è quella di aggiungere un identificatore univoco che cambi ogni volta, quindi ricostruirà l'elenco ogni volta senza animazione. Verificato su iOS 13.4.

var body: some View {
    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }
    }
    .id(UUID()) // no animation
}

-3
  1. Non è necessario utilizzare ForEach all'interno di List nel caso in cui non si utilizzi Section. Quindi invece di:

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        })
    }

    Il seguente codice è sufficiente per scrivere:

    List(viewModel.options) { option in
        Text(option.displayValue)
    }

    E anche meglio sapere che l'uso di ForEach può creare alcuni problemi, ad esempio: SwiftUI: è possibile utilizzare ForEach + ContextMenu?

  2. Nel caso in cui utilizzerai solo ForEach()o solo List()+ .animation(nil)- devi risolvere il tuo problema:

    Esempio 1:

    ForEach(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    Esempio 2:

    List(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    Sono stato testato sia su macOS 10.15.2 (19C57) che funziona perfettamente.

  3. Inoltre è possibile provare ad usare .animation(nil)su Liste ForEachentrambi. Non ho provato ... ma penso che anche questo ti darà l'effetto necessario.

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }.animation(nil)
    }.animation(nil)

.animation(nil) sembra non avere alcun effetto sulla 13.3, sfortunatamente
Fabian Streitel il

@FabianStreitel Sono stato testato nella seconda parte su macOS 10.15.2 (19C57) e funziona perfettamente.
Andrew,

E ho testato tutte e tre le varianti su iOS 13.3 (come indicato nel mio commento sopra) e nessuna di esse cambia affatto il comportamento dell'elenco. Purtroppo OP non ha dichiarato se stanno realizzando un'app iOS o macOS. Ma penso che le informazioni che non funzionano su iOS siano rilevanti anche per gli altri.
Fabian Streitel il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.