Анимация при переключении с помощью SwiftUI - PullRequest
1 голос
/ 08 июля 2019

Я строю простой экран настроек.

Когда активируется первая настройка, появляется контроль скорости. Когда он выключен, контроль скорости исчезает.

Исходя из того, что я знаю о SwiftUI, он должен автоматически анимироваться на основе приведенного ниже кода, но вместо этого он просто появляется и исчезает.

Как я могу сделать эту анимацию лучше с SwiftUI, чтобы она скользила вниз от ячейки над ней, как в этой презентации в 53: 00?

GIF of setting animation

import SwiftUI
import Combine

struct ContentView : View {

    @ObjectBinding var settingsStore: SettingsStore

    var body: some View {
        NavigationView {
            Form {
                Toggle(isOn: $settingsStore.settingActivated.animation(.basic(duration: 3, curve: .easeInOut))) {
                    Text("Setting Activated")
                }
                if settingsStore.settingActivated {
                    VStack(alignment: .leading) {
                        Text("Speed Control")
                        HStack {
                            Image(systemName: "tortoise")
                            Slider(value: .constant(10), from: 0, through: 50, by: 1)
                            Image(systemName: "hare")
                        }
                    }.transition(.opacity)
                }
            }.navigationBarTitle(Text("Settings"))
        }
    }
}

class SettingsStore: BindableObject {

    let didChange = PassthroughSubject<Void, Never>()

    var settingActivated: Bool = UserDefaults.settingActivated {
        didSet {

            UserDefaults.settingActivated = settingActivated

            didChange.send()
        }
    }
}

extension UserDefaults {

    private struct Keys {
        static let settingActivated = "SettingActivated"
    }

    static var settingActivated: Bool {
        get {
            return UserDefaults.standard.bool(forKey: Keys.settingActivated)
        }
        set {
            UserDefaults.standard.set(newValue, forKey: Keys.settingActivated)
        }
    }
}
...