SwiftUI: анимация изменений в списке без анимации изменений содержимого - PullRequest
2 голосов
/ 29 января 2020

У меня есть простое приложение в SwiftUI, которое показывает List, и каждый элемент представляет собой VStack с двумя Text элементами:

var body: some View {
    List(elements) { item in
        NavigationLink(destination: DetailView(item: item)) {
            VStack(alignment: .leading) {
                Text(item.name) 
                Text(self.distanceString(for: item.distance))
            }
        }
    }
    .animation(.default)
}

.animate() находится там, потому что я хотите анимировать изменения в списке при изменении массива elements. К сожалению, SwiftUI также анимирует любые изменения в контенте, что приводит к странному поведению. Например, второй Text в каждом элементе обновляется довольно часто, и теперь в обновлении вскоре будет показана усеченная метка (с ... в конце) перед обновлением до нового содержимого.

Так как я могу предотвратить это странное поведение при обновлении содержимого списка, но сохранять анимацию при изменении элементов в списке?

В случае необходимости я создаю приложение для watchOS.

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Следующее должно отключить анимацию для внутренних элементов строки

VStack(alignment: .leading) {
    Text(item.name) 
    Text(self.distanceString(for: item.distance))
}
.animation(nil)
0 голосов
/ 20 марта 2020

Ответ @Asperi устранил проблему, с которой я тоже столкнулся (как всегда, его голос Upvoted).

У меня была проблема, когда я анимировал весь экран, используя приведенное ниже: AnyTransition.asymmetric(insertion: .move(edge: .bottom), removal: .move(edge: .top))

И все подэкраны Text () и Button () также анимированы странным и не таким чудесным способом. Я использовал анимацию (ноль), чтобы исправить проблему, увидев ответ Аспери. Однако проблема заключалась в том, что мои кнопки больше не анимировались при выделении, наряду с другими анимациями, которые я хотел.

Поэтому я добавил новую переменную State для включения и выключения анимации VStack. По умолчанию они отключены, и после того, как представление было анимировано на экране, я включаю их после небольшой задержки:

struct QuestionView: View {@State private var allowAnimations: Bool = false

var body : some View {
    VStack(alignment: .leading, spacing: 6.0) {
        Text("Some Text")

        Button(action: {}, label:Text("A Button")
    }
    .animation(self.allowAnimations ? .default : nil)
    .onAppear() {
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
             self.allowAnimations = true
         }
    }
}

Просто добавьте это для тех, у кого похожая проблема и мне нужно развить превосходный ответ Аспери.

...