Как я могу создать несколько переходов в ZStack? - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь создать несколько переходов внутри ZStack.

Это тестовое представление с некоторым текстом и кружком, каждый из которых имеет свой собственный переход.

struct Test: View {
    @Binding var isPresented: Bool
    @State private var showCircle: Bool = false
    @State private var showRect: Bool = false

    var body: some View {
        ZStack {
             if showRect {
                 VStack {
                     Text("Hello World")
                         .foregroundColor(.white)
                         .padding()
                 }
                 .background(Color.green)
                 .transition(.move(edge: .bottom))
            }

            if showCircle {
                Circle()
                    .fill(Color.purple)
                    .transition(.slide)
            }
        }
        .onAppear() {
            withAnimation {
                self.showRect.toggle()
                self.showCircle.toggle()
            }
        }
        .onDisappear() {
            withAnimation {
                self.showCircle.toggle()
                self.showRect.toggle()
            }
        }
    }
}

Я добавляю это представление следующим образом:

struct ContentView: View {
    @State private var toggler: Bool = false

    var body: some View {
        ZStack {

            if toggler {
                Test(isPresented: $toggler)
            }

            Button("Show/Hide") {
                withAnimation {
                    self.toggler.toggle()
                }
            }
        }
    }
}

переходы работают на Appar.
Но OnDisappear, кажется, вызывается во время удаления, а не раньше.

Как я могу сбросить переменные состояния, чтобы инициировать переходы при удалении, или какой другой подход я должен использовать?

Другие попытки:
Я также пытался создать собственные модификаторы, чтобы использовать их с Anytransition.modifier - но не получилось, потому что я не мог выполнить тип для доступа к состоянию vars, а Anytransition.modifier требуетмодификаторы, чтобы соответствовать ViewModifier.

функция dismiss внутри TestView, которая работает, если я хочу отключить представление от самого себя, но, очевидно, нет, когда оно отклоняется его родителем.

1 Ответ

0 голосов
/ 11 ноября 2019

сделать это так, вместо onAppear / исчезнуть

struct ContentView : View {
    @State private var isButtonVisible = true

    var body: some View {
        VStack {
            Toggle(isOn: $isButtonVisible.animation()) {
                Text("Show/Hide button")
            }

            if isButtonVisible {
                Button(action: {}) {
                    Text("Hidden Button")
                }.transition(.move(edge: .trailing))
            }
        }
    }
}

или с помощью кнопки

struct ContentView : View {
    @State private var isButtonVisible = true

    var body: some View {
        VStack {
            Button(action: {
                withAnimation {
                    self.isButtonVisible.toggle()
                }
            }) {
                Text("Press me")
            }

            if isButtonVisible {
                Button(action: {}) {
                    Text("Hidden Button")
                }.transition(.move(edge: .trailing))
            }
        }
    }
}

вы также можете комбинировать переход: проверить это: https://swiftwithmajid.com/2019/06/26/animations-in-swiftui/

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