В моем макете 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)```