2016-08-21 10 views
15

Я пытаюсь переместить вид вверх, когда клавиатура всплывает над UITextfield, которая размещена на UIScrollView. Я использую UIKeyboardWillShowNotification и UIKeyboardWillHideNotification.Приложение iOS «Gboard», высота уведомлений UIKeyboard неверна или недействительна

Он отлично работает при использовании iOS Keyboard, где я получаю высоту 297.

Мой клиент использует Gboard keyboard, он жаловался, что вид не перемещается. Когда я тестировал, я получаю высоту клавиатуры как 44.

Я пробовал оба ключа UIKeyboardFrameBeginUserInfoKey и UIKeyboardFrameEndUserInfoKey для объекта NSNotifiction userInfo. Оба дают только 44.

Я пробовал с UIKeyboardDidShowNotification и UIKeyboardDidHideNotification также, все тот же выпуск.

Может ли кто-нибудь помочь мне в этом ..?

+1

Посмотрите на этот пост: https://stackoverflow.com/questions/28813339/move-a-view-up-only-when-the- keyboard-covers-an-input-field/32555911 # 32555911 это может помочь –

+0

@MrH, Спасибо за ссылку:) ... я пробовал, но он не работает с 'UITableview'. У меня есть «UIScrollView» и «UITableView» – arthankamal

+0

, пожалуйста, включите код, чтобы получить высоту клавиатуры в указанном выше вопросе. – iMHitesh

ответ

-1

НЕ ОТВЕТ, но только здесь b/c его слишком долго, чтобы вставить комментарий. Вот мой код, чтобы получить высоту клавиатуры @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)) 
    } 
}