Как обращаться с Soft Keyboard в Swift - PullRequest
0 голосов
/ 24 февраля 2020

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

 @objc func keyboardWillShow(notification: NSNotification) {
    var  newYpos = CGFloat()
    let rate = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        self.customView.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
        newYpos = keyboardSize.height
        //   print(newYpos)
        self.tap.isEnabled = true
    }
    if self.yPosAfterFirstNotif == 0.0{
        self.yPosAfterFirstNotif = newYpos
        UIView.animate(withDuration: rate.doubleValue, animations: {
            self.customView.bottomC.constant = (-self.yPosAfterFirstNotif)
        })
    }
    self.customView.tableView.contentInset = UIEdgeInsetsMake(0, 0, newYpos, 0)
    //scrollToBottom()
    self.customView.tableView.scrollToBottomm()
    self.customView.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}

И вот как я скрываю свою клавиатуру

  @objc func keyboardWillHide(notification: NSNotification) {
          var  newYpos = CGFloat()
      let rate = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
            {
                 newYpos = keyboardSize.height
                 self.yPosAfterFirstNotif = newYpos
                self.customView.tableView.contentInset = UIEdgeInsetsMake(0, 0, newYpos, 0)
            }
            UIView.animate(withDuration: rate.doubleValue, animations: {
                self.customView.bottomC.constant = (+self.yPosAfterFirstNotif)
            })
            //  self.constraintCommentViewBottom.constant = 0
            self.yPosAfterFirstNotif = 0.0
            self.customView.tableView.contentInset = UIEdgeInsetsMake(0, 0, newYpos, 0)

        self.tap.isEnabled = false


        if self.customView.ChatTextField.text.characters.count == 0
        {
            self.customView.sendButton.isHidden = true
            self.customView.recordButton.isHidden = false
            self.customView.cameraButton.isHidden = false
            self.customView.textFieldTrailling.constant = 44
        }




    }

перед представлением клавиатуры

enter image description here

после представления клавиатуры

enter image description here

после увольнения клавиатуры

enter image description here Нужна помощь Спасибо

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Я думаю, что ваш keyboardSize в keyboardWillHide не правильно, попробуйте использовать UIKeyboardFrameEndUserInfokey вместо UIKeyboardFrameBeginUserInfoKey

0 голосов
/ 24 февраля 2020

Пожалуйста, попробуйте добавить код ниже, чтобы скрыть / показать панель навигации при скрытии / показе клавиатуры

Также вы можете управлять прокруткой тем же способом в зависимости от размера клавиатуры.

Обновленный ответ :: Вы можете установить ограничения, чтобы нижняя часть представления содержала текстовое поле и обновляла его при показе клавиатуры \ скрыть. Меня устраивает.

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

}

@objc func keyboardWillShow(notification: Notification) {
     guard let userInfo = (sender as Notification).userInfo, let value = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
    let newHeight: CGFloat
    if #available(iOS 11.0, *) {
        newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom
    } else {
        newHeight = value.cgRectValue.height
    }
    self.chatViewBottomConstraints.constant = newHeight
    DispatchQueue.main.async {
        self.tableView.scrollToBottom()
    }

}

@objc func keyboardWillHide(notification: Notification) {
 DispatchQueue.main.async {
        self.chatViewBottomConstraints.constant  = 0.0
        self.tableView.scrollToBottom()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...