Переход с видом с помощью SwiftUI без анимации всего вида - PullRequest
0 голосов
/ 04 ноября 2019

Используя SwiftUI, у меня есть вид, который включает ползунок, в котором я использую переход, чтобы скользить снизу. Все работает хорошо, пока ползунок не перемещается быстро вперед и назад. При этом текстовое поле анимируется и будет показывать «...» при изменении от 1 до двух цифр.

Вот мой тестовый код, показывающий это:

struct TestSliderView: View {
    @State private var val: Double = 0
    @State private var showSlider: Bool = false

    var body: some View {
        VStack {
            Button(action: {
                self.showSlider.toggle()
            }) {
                Text("Show Slider")
            }
            Spacer()

            if showSlider {
                JustTheSlider(val: $val)
                    .padding()
                    .transition(.move(edge: .bottom))
                    .animation(.linear(duration: 0.4))
            }
        }
    }
}

struct JustTheSlider: View {
    @Binding var val: Double
    var body: some View {
        VStack {
            Text("Slider")
                .font(.title)
            HStack {
                Text("Value: ")
                    .frame(minWidth: 80, alignment: .leading)
                Slider(value: $val, in: 0...30, step: 1)
                Text("\(Int(val))")
                    .frame(minWidth: 20, alignment: .trailing)
                    .font(Font.body.monospacedDigit())
                    .padding(.horizontal)
            }
        }
    }
}

Одним из способов было бы удалить строку .animation(.linear(duration: 0.4)) и обернуть действие кнопки анимацией, например:

            Button(action: {
                withAnimation(.linear(duration: 0.4)) {
                    self.showSlider.toggle()
                }
            }) {
                Text("Show Slider")
            }

Это останавливает анимацию текста, но тогда представление только выдвигается и просто появляется без анимации слайдов.

Есть идеи?

1 Ответ

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

Вам нужно анимировать переменную состояния, а не представление.

 var body: some View {
    VStack {
        Button(action: {
            withAnimation{
                self.showSlider.toggle()}

        }) {
            Text("Show Slider")
        }
        Spacer()

        if showSlider {
            JustTheSlider(val: $val)
                .padding()
                .transition(.move(edge: .bottom))

        }
    }
}

Как показано в последней строке.

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