Как применить анимацию замедления с клавиатурыWillShowNotification к модификатору .animation SwiftUI? - PullRequest
2 голосов
/ 16 января 2020

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

Вот мой взгляд

struct ContentView: View {
    @State private var name = ""

    @ObservedObject private var keyboard = KeyboardResponder()

    var body: some View {
        VStack(spacing: 0) {
            TextField("Fill in the restaurant name", text: $name)
              .padding(.all)
            TextField("Fill in the restaurant name", text: $name)
              .padding(.all)
        }
        .padding(.bottom, keyboard.currentHeight)
        .animation(.easeOut(duration: keyboard.duration)) //trying to apply the easing I grabbed from my keyboard ObservableObject here
    }
}

Вот мой ответчик клавиатуры я использую для анимации представления при необходимости

final class KeyboardResponder: ObservableObject {
    private var notificationCenter: NotificationCenter
    @Published private(set) var currentHeight: CGFloat = 0

    var duration: TimeInterval = 0
    var curve: Int = 0

    init(center: NotificationCenter = .default) {
        notificationCenter = center
        notificationCenter.addObserver(self, selector: #selector(keyBoardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        notificationCenter.addObserver(self, selector: #selector(keyBoardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    }

    deinit {
        notificationCenter.removeObserver(self)
    }

    @objc func keyBoardWillShow(notification: Notification) {

        duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
        curve =  notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as! Int //how can I add this to my animation modifier

        print("~~~~> curve \(curve)")

        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            currentHeight = keyboardSize.height
        }
    }

    @objc func keyBoardWillHide(notification: Notification) {
        duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
        curve =  notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as! Int
        currentHeight = 0
    }
}

в уведомлении keyBoardWillShow. Я могу получить замедление, но оттуда не могу понять, как применить это к модификатору .animation в представлении. Продолжительность была достаточно простой для применения. Может быть, мне нужно сделать свой собственный тип анимации? Я даже не уверен, что это возможно.

.animation(.easeOut(duration: keyboard.duration))

В UIKit есть параметр options в UIView.animate, где вы можете применить замедление.

UIView.animate(withDuration: TimeInterval(duration), delay: 0, options: [UIViewAnimationOptions(rawValue: UInt(curve))], animations: {
      self.view.layoutIfNeeded()
    }, completion: nil)```
...