Анимации SwiftUI отличаются, если они вызваны из VStack или NavigationItem - PullRequest
0 голосов
/ 30 июня 2019

У меня есть очень простой VStack, основанный непосредственно на одном из превосходных сэмплов Пола Хадсона SwiftUI.Есть две строки Text, одна скрытая.Есть метод для переключения @State var, который управляет скрытым Text.

Если я вызываю эту функцию из VStack, она анимируется правильно.Если я вызываю его с navigationBarItems, анимация теряется.Я что-то упускаю из-за того, как составляются представления?

struct ContentView: View {
    @State var showDetails = false
    func toggleDetails() { withAnimation { self.showDetails.toggle() } }

    var body: some View {
        NavigationView() {
            VStack {
                Button(action: { self.toggleDetails() }) { Text("Tap to show details") }

                if showDetails { Text("Details go here.") }
            }
            .navigationBarTitle(Text("Nav Bar"))
            .navigationBarItems(trailing: 
               Button(action: { self.toggleDetails() }) {
                    Text("Details")
               })
        }
    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

Inconsistent Animations

1 Ответ

0 голосов
/ 01 июля 2019

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

Если вместо использования явных анимаций (т.е. с анимацией ) вы используете неявные анимации как для VStack, так и для текста, это работает:

enter image description here

struct ContentView: View {
    @State var showDetails = false
    func toggleDetails() { self.showDetails.toggle() }

    var body: some View {
        NavigationView() {
            VStack {
                Button(action: { self.toggleDetails() }) { Text("Tap to show details") }

                if showDetails {
                    Text("Details go here.").animation(.basic())

                }
            }
            .animation(.basic())
            .navigationBarTitle(Text("Nav Bar"))
            .navigationBarItems(trailing:
                Button(action: {
                    self.toggleDetails()

                }) { Text("Details") })
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...