Анимация не работает с комбинацией GeometryReader и NavigationView

У меня есть анимированное изображение, которое скользит вверх и вниз, используя смещение и таймер. Это работает нормально, пока вы не объедините GeometryReader и NavigationView. Как для NavView, так и для GeoReader по отдельности анимация также работает. Какие-нибудь решения? (Я знаю, что в этом примере GeometryReader не нужен)

struct TestView: View{

@State var offsetSwipeUp: CGFloat = 0

var body: some View{
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    return NavigationView {
        GeometryReader { geometry in
            Image(systemName: "chevron.up")
                .animation(.easeInOut(duration: 1))
                .onReceive(timer){ _ in
                    if self.offsetSwipeUp == .zero{
                        self.offsetSwipeUp = -10
                    } else {
                        self.offsetSwipeUp = .zero
                    }
            }
            .offset(y: CGFloat(self.offsetSwipeUp))
            .navigationBarTitle("")
            .navigationBarHidden(true)
        }
    }
}
}

1 ответ

Решение

В этом случае порядок модификаторов выглядит важным.

Нижеприведенный вариант работает. Протестировано с Xcode 11.4 / iOS 13.4

struct TestView: View {

    @State var offsetSwipeUp: CGFloat = 0

    var body: some View{
        let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
        return NavigationView {
            GeometryReader { geometry in
                Image(systemName: "chevron.up")
                    .animation(.easeInOut(duration: 1))
                    .offset(y: CGFloat(self.offsetSwipeUp))
                    .navigationBarTitle("")
                    .navigationBarHidden(true)
            }
        }
        .onReceive(timer){ _ in
            if self.offsetSwipeUp == .zero{
                self.offsetSwipeUp = -10
            } else {
                self.offsetSwipeUp = .zero
            }
        }
    }
}
Другие вопросы по тегам