键盘出现时更改约束 - Swift

时间:2018-03-23 01:55:14

标签: ios swift constraints

当键盘出现时,我的UIView无法正常移动。 UIView中有一个用于输入文本的UITextView。如果我选择TextView输入文本,键盘会出现,但UIView不会移动第一次。如果我点击背景并使键盘消失然后再次点击TextView,则UIView会正确向上移动。有谁知道这里发生了什么?

class ChatViewController: UIViewController, CNContactPickerDelegate, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource, UIToolbarDelegate, UITextFieldDelegate, UITextViewDelegate {

@IBOutlet weak var composeTextView: UITextView!

@IBOutlet weak var composeViewBottomConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    composeTextView.delegate = self

}

func textViewDidBeginEditing(_ textView: UITextView) {

    UIView.animate(withDuration: 0.5){
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: .UIKeyboardWillShow, object: nil)

    }

    self.view.layoutIfNeeded()


}

@objc func keyboardWillShow(notification: Notification) {
    let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue

    let keyboardHeight = keyboardSize?.height

        if #available(iOS 11.0, *){

            self.composeViewBottomConstraint.constant = keyboardHeight! - view.safeAreaInsets.bottom
        }
        else {
            self.composeViewBottomConstraint.constant = view.safeAreaInsets.bottom
        }
        self.view.layoutIfNeeded()

}

}

2 个答案:

答案 0 :(得分:4)

问题是第一次单击textView时视图没有上升,showKeyboard观察者是在beginEditing中添加的,所以这一行应该在viewDidLoad

  NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
  NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: .UIKeyboardWillHide, object: nil)

除了以下修复

func textViewDidBeginEditing(_ textView: UITextView) {

     // I think no need for it

}

 @objc func keyboardWillShow(notification: Notification) {

     let keyboardSize = (notification.userInfo?  [UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue

     let keyboardHeight = keyboardSize?.height

     if #available(iOS 11.0, *){

          self.composeViewBottomConstraint.constant = keyboardHeight! - view.safeAreaInsets.bottom
      }
      else {
           self.composeViewBottomConstraint.constant = view.safeAreaInsets.bottom
         }

       UIView.animate(withDuration: 0.5){

          self.view.layoutIfNeeded()

       }


   }

  @objc func keyboardWillHide(notification: Notification){

      self.composeViewBottomConstraint.constant =  0 // or change according to your logic  

       UIView.animate(withDuration: 0.5){

          self.view.layoutIfNeeded()

       }

  }

答案 1 :(得分:0)

试试这个

let KEYBOARDAPPEAR = 226

func textViewDidBeginEditing(_ textView: UITextView) {
    animateViewMoving(up: true, moveValue: CGFloat(KEYBOARDAPPEAR), view: self.view)

}

func textViewDidEndEditing(_ textView: UITextView) {
   animateViewMoving(up: false, moveValue: CGFloat(KEYBOARDAPPEAR), view: self.view)
}

func animateViewMoving (up:Bool, moveValue :CGFloat, view:UIView){

    let movementDistance:CGFloat = -moveValue
    let movementDuration: Double = 0.3
    var movement:CGFloat = 0
    if up{
        movement = movementDistance
    }else{
        movement = -movementDistance
    }
    UIView.beginAnimations("animateTextField", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration)
    view.frame = view.frame.offsetBy(dx: 0, dy: movement)
    UIView.commitAnimations()
}