ios - how - scrollview textfield swift
La aplicación "Gboard" de iOS, la altura de notificación de UIKeyboard es incorrecta o no es válida (1)
Estoy intentando mover la vista hacia arriba cuando el teclado aparece sobre el campo de UITextfield
la UITextfield
que se encuentra en UIScrollView
. Estoy usando UIKeyboardWillShowNotification
y UIKeyboardWillHideNotification
para esto.
Funciona perfectamente cuando iOS Keyboard
donde obtengo la altura 297
.
Mi cliente está usando el Gboard keyboard
, se quejó de que la vista no se está moviendo. Cuando lo probé, obtengo la altura del teclado en 44
.
He intentado las dos claves UIKeyboardFrameBeginUserInfoKey
y UIKeyboardFrameEndUserInfoKey
para el objeto de NSNotifiction userInfo
. Ambos están dando 44
solamente.
Intenté con UIKeyboardDidShowNotification
y UIKeyboardDidHideNotification
también, sigue siendo el mismo problema.
Alguien podría ayudarme con esto..?
NO UNA RESPUESTA, pero solo aquí b / c es demasiado largo para pegar en el comentario. Aquí está mi código para obtener la altura del teclado @iMHitesh:
class KeyboardShiftAnimator {
fileprivate let showAnimation: (_ keyboardHeight: CGFloat) -> Void
fileprivate let hideAnimation: (Void) -> Void
fileprivate weak var ownerController: UIViewController!
fileprivate let disableAnimations: Bool
deinit {
NotificationCenter.default.removeObserver(self)
}
init(ownerController: UIViewController, disableAnimations: Bool = false, showAnimation: @escaping (_ keyboardHeight: CGFloat) -> Void, hideAnimation: @escaping (Void) -> Void) {
self.showAnimation = showAnimation
self.hideAnimation = hideAnimation
self.ownerController = ownerController
self.disableAnimations = disableAnimations
NotificationCenter.default.addObserver(
self,
selector:
#selector(KeyboardShiftAnimator.keyboardWillShow(_:)),
name: NSNotification.Name.UIKeyboardWillShow,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector:
#selector(KeyboardShiftAnimator.keyboardWillHide(_:)),
name: NSNotification.Name.UIKeyboardWillHide,
object: nil
)
}
func makeAppropriateLayout(_ duration: NSNumber) {
if self.disableAnimations {
UIView.performWithoutAnimation({
self.ownerController.view.setNeedsUpdateConstraints()
self.ownerController.view.updateConstraintsIfNeeded()
self.ownerController.view.layoutIfNeeded()
})
} else {
self.ownerController.view.setNeedsUpdateConstraints()
self.ownerController.view.updateConstraintsIfNeeded()
UIView.animate(withDuration: duration.doubleValue, animations: { () -> Void in
self.ownerController.view.layoutIfNeeded()
})
}
}
@objc func keyboardWillShow(_ note: Foundation.Notification) {
guard let endFrameValue = (note as NSNotification).userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue,
let animationDuration = (note as NSNotification).userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber
else { return }
let keyboardHeight = endFrameValue.cgRectValue.size.height
showAnimation(keyboardHeight)
makeAppropriateLayout(animationDuration)
}
@objc func keyboardWillHide(_ note: Foundation.Notification) {
let animationDuration = (note as NSNotification).userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber
let duration = animationDuration != nil ? animationDuration!.doubleValue : 0.25
hideAnimation()
makeAppropriateLayout(NSNumber(value: duration))
}
}