Создайте переход, удаление которого зависит от значения @State при удалении представления - PullRequest
1 голос
/ 21 апреля 2020

Я хотел бы создать переход, удаление которого зависит от значения @State при удалении представления.

Вот то, что я пробовал.

Если isValid верно когда появится представление, оно будет использовать .move(edge: .trailing) для удаления, даже если за это время isValid станет ложным.

Я пытаюсь получить переход .move(edge: .leading), если isValid равен false, когда представление удаляется, даже если оно было true, когда оно было вставлено.

Проблема возникает, когда я переключаю show и isValid одновременно.

struct TextTransitionView: View {
    @State var isValid = false
    @State var show = false

    var body: some View {
        VStack {
            Spacer()

            if show {
                Text("TEXT").transition(slideTransition)
            }

            Spacer()

            Text("Move to \(isValid ? "right" : "left")")

            Button("Toggle isValid") {
                self.isValid.toggle()
            }

            Button("Toggle show") {
                withAnimation { self.show.toggle() }
            }

            Button("Toggle isValid and show") {
                withAnimation {
                    self.isValid.toggle()
                    self.show.toggle()
                }
            }
        }
    }

    var slideTransition: AnyTransition {
        let removal = isValid ? AnyTransition.move(edge: .trailing) : AnyTransition.move(edge: .leading)
        return .asymmetric(insertion: .identity, removal: removal)
    }
}

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Здесь возможен подход. Протестировано с Xcode 11.4 / iOS 13.4

demo

struct DemoTextTransition: View {
    @State var isValid = false
    @State var show = false
    var body: some View {
        VStack {
            if show {
                Text("TEXT").transition(slideTransition)
            }
            Button("Valid: \(isValid ? "True" : "False")") {
                self.isValid.toggle()
            }
            Button("Test") {
                withAnimation { self.show.toggle() }
            }
        }
    }

    var slideTransition: AnyTransition {
        let removal = isValid ? AnyTransition.move(edge: .trailing) : AnyTransition.move(edge: .leading)
        return .asymmetric(insertion: .identity, removal: removal)
    }
}
0 голосов
/ 22 апреля 2020

Проблема была в том, что isValid.toggle() находился внутри withAnimation. Вывод этой строки из блока withAnimation решил проблему.

Button("Toggle isValid and show") {
    self.isValid.toggle()
    withAnimation {
        self.show.toggle()
    }
}

0 голосов
/ 21 апреля 2020

ты имеешь в виду, как так?

struct ContentView: View {

    @State var isValid = false

    var slideTransition: AnyTransition {
        let removal = isValid ? AnyTransition.move(edge: .trailing) : AnyTransition.move(edge: .leading)
        return .asymmetric(insertion: .identity, removal: removal)
    }

    var body: some View {
        VStack {
            Button(action: {
                withAnimation() {
                    self.isValid.toggle()
                }
            }) {
                Text("animate it")
            }
            if isValid {
                Text("text").transition(slideTransition)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...