SwiftUI'de gözlenen nesne değiştiğinde listedeki animasyonu nasıl devre dışı bırakabilirim?


15

Görünüm modeli verileri değiştiğinde animasyonu nasıl devre dışı bırakabilirim?

Takip koduna sahibim:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

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

Görünüm modeli değişiklikleri her Listanimasyonla güncellendiğinde.
Nasıl devre dışı bırakabilirim?
Eklemeyi denedim .animation(nil)ama yardımcı olmuyor

Yanıtlar:


1

Apple bize Liste üzerinde bir değişiklik yapana kadar geçici çözüm List.id (_ :) 'i çağırır. List'in iç durumunu değiştirir ve Listeyi animasyon olmadan anında yeniden oluşturmaya zorlar. Ayrıntılar için bkz Liste yeniden canlandırma aksaklıkları

Aynı şey herhangi bir Görünüm için de yapılabilir (işlev kimliği () Görünüm protokolünün bir parçasıdır), ancak tüm durum değişkenlerinin başlangıç ​​"varsayılan" durumuna sahip olacağını bilmeniz gerekir, bu yüzden dikkatli kullanın. Görünümü "yeniden oluşturmak" ile aynıdır.

Nasıl çalıştığını anlamak için bkz. Https://swiftui-lab.com/swiftui-id/


1

Bulduğum çözüm, her seferinde değişen benzersiz bir tanımlayıcı eklemektir, böylece listeyi animasyon olmadan her seferinde yeniden oluşturur. İOS 13.4'te doğrulandı.

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

-3
  1. Section'S kullanmıyorsanız ForEach'ı Listenin içinde kullanmanıza gerek yoktur . Bunun yerine:

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

    Aşağıdaki kod yazmak yeterlidir:

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

    Ayrıca, ForEach kullanımının bazı sorunlar yaratabileceğini bilmek daha iyidir, örneğin: SwiftUI: ForEach + ContextMenu kullanmak mümkün mü?

  2. Sadece ForEach()veya sadeceList() +.animation(nil) sorununuzu çözmelisiniz:

    Örnek 1:

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

    Örnek 2:

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

    Hem macOS 10.15.2 (19C57) üzerinde test edilmiştir ve mükemmel çalışıyor.

  3. Ayrıca kullanım deneyebilirsiniz .animation(nil)üzerinde Listve ForEachhem. Denemedim ... ama bence bu sana da gerekli etkiyi verecek.

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

.animation(nil)13.3 üzerinde hiçbir etkisi yok gibi görünüyor, ne yazık ki
Fabian Streitel

@FabianStreitel macOS 10.15.2 (19C57) üzerinde bölüm 2'yi test ettim ve mükemmel çalışıyor.
Andrew

Ve iOS 13.3'teki üç varyantı da test ediyorum (yukarıdaki yorumumda belirtildiği gibi) ve hiçbiri Liste davranışını değiştirmiyor. OP maalesef bir iOS veya macOS uygulaması yapıp yapmadıklarını belirtmedi. Ancak iOS'ta çalışmadığı bilgisinin başkaları için de geçerli olduğunu düşünüyorum.
Fabian Streitel

Kısa süre önce .animation(nil)iOS 13.4 ile Xcode 11.4 kullanarak test yaptım ve benim için çalışıyor.
Simen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.