Я работаю над приложением iOS с Swift 4. В этом проекте я создал динамические TextFields.И я добавил UIScrollView, когда мы щелкаем на TextField, вид прокрутки должен двигаться вверх, пока появляется клавиатура, и вид прокрутки должен двигаться вниз, когда исчезает клавиатура.Приведенный ниже код работает нормально только при первом клике.Со второго раза он не работает.Когда я редактирую, клавиатура TextField появляется, но прокрутка не движется вверх.
@IBOutlet weak var contentView: UIView!
@IBOutlet weak var constraintContentHeight: NSLayoutConstraint!
var activeField: UITextField?
var lastOffset: CGPoint!
var keyboardHeight: CGFloat!
В ViewDidLoad ()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
// Add touch gesture for contentView
self.contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(returnTextView(gesture:))))
@objc func keyboardWillShow(notification: NSNotification) {
if keyboardHeight != nil {
return
}
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
keyboardHeight = keyboardSize.height
// so increase contentView's height by keyboard height
UIView.animate(withDuration: 0.3, animations: {
self.constraintContentHeight.constant += self.keyboardHeight
})
// move if keyboard hide input field
let distanceToBottom = self.myScroll.frame.size.height - (activeField?.frame.origin.y)! - (activeField?.frame.size.height)!
let collapseSpace = keyboardHeight - distanceToBottom
if collapseSpace < 0 {
// no collapse
return
}
// set new offset for scroll view
UIView.animate(withDuration: 0.3, animations: {
// scroll to the position above keyboard 10 points
self.myScroll.contentOffset = CGPoint(x: self.lastOffset.x, y: collapseSpace + 10)
})
}
}
@objc func keyboardWillHide(notification: NSNotification) {
UIView.animate(withDuration: 0.3) {
self.constraintContentHeight.constant -= self.keyboardHeight
self.myScroll.contentOffset = self.lastOffset
}
keyboardHeight = nil
}
@objc func returnTextView(gesture: UIGestureRecognizer) {
guard activeField != nil else {
return
}
activeField?.resignFirstResponder()
activeField = nil
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
activeField = textField
lastOffset = self.myScroll.contentOffset
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
activeField?.resignFirstResponder()
activeField = nil
return true
}
Может кто-нибудь, пожалуйста, помогите мне решить эту проблему.Какую ошибку я совершил здесь.
Заранее спасибо.