iPhone X keyboard appear showing extra space

后端 未结 6 919
别那么骄傲
别那么骄傲 2020-12-14 07:54

I have created a chat UI in which I have added a constraint for the tableView to the bottom of the screen. I am changing the constraint value by ad

6条回答
  •  粉色の甜心
    2020-12-14 08:33

    Make an outlet to your constraint to your ViewController. I'll refer to it as yourConstraint for now. Then add code to discover when the keyboard is being shown and when it is being dismissed. There you change the constant of the constraint accordingly. This allows you to keep using constraints.

    In viewWillAppear:

    NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillShow), name:        NSNotification.Name.UIKeyboardWillShow, object: nil) // <=== Replace YourViewController with name of your view controller
    NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) // <=== Replace YourViewController with name of your view controller
    

    In viewWillDisappear:

    NotificationCenter.default.removeObserver(self)
    

    In your UIViewController

    @objc private func keyboardWillShow(notification: Notification) {
        guard let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
            yourConstraint.isActive = false // <=== 
            view.layoutIfNeeded()
            return
        }
        let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4
        yourConstraint.constant = newValue // <===
        UIView.animate(withDuration: duration) {
            self.view.layoutIfNeeded()
        }
    }
    
    @objc private func keyboardWillHide(notification: Notification) {
        let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4
        yourConstraint.constant = oldValue
        UIView.animate(withDuration: duration) {
            self.view.layoutIfNeeded()
        }
    }
    

    The UIView.animate is not necessary (the inside of the block is), but it makes the transition look nice.

提交回复
热议问题