更改键盘动画反弹的情节提要约束



显示键盘时,我在更改约束时遇到问题。 我目前正在构建一个登录屏幕,其中我已经设置了约束以在框架中水平和垂直地将具有 2 个文本字段和一个按钮的堆栈视图居中。徽标(图像视图)位于堆栈视图上方,并具有单独的约束。

当键盘出现时,我想对约束进行动画处理,以将堆栈视图和徽标向上移动一点,以便键盘不会覆盖任何内容。

键盘在字段上还有一个"下一步"按钮和一个"开始"按钮。

我现在遇到的问题是,每次我按"下一步"或清除文本字段时,约束都会再次更改,因此堆栈视图和徽标"反弹",这有点烦人。另外,我知道很多人可能会最喜欢使用滚动视图,但这在这里不是一个真正的选择。 我在底部也有按钮来创建帐户,所以我也无法真正更改整个框架高度。

我猜,因为它调用了"textField.resignFirstResponder()",所以调用了"keyboardWillHide"通知,因此它开始动画化。

我在互联网上到处搜索并尝试了很多事情来解决它,但我现在真的没有想法和动力,所以我希望有人知道我可能在这里做错了什么。 提前感谢!

class LoginVC: UIViewController, UITextFieldDelegate {
@IBOutlet weak var emailField: SkyFloatingLabelTextFieldWithIcon!
@IBOutlet weak var passwordField: SkyFloatingLabelTextFieldWithIcon!
@IBOutlet weak var signInBtn: TransitionSubmitButton!
@IBOutlet weak var contentCenterConstraint: NSLayoutConstraint!
@IBOutlet weak var logoTopConstraint: NSLayoutConstraint!
@IBOutlet weak var equalWidthConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
setupKeyboardButtons()
addObservers()
// using extension to hide keyboard when tapped around
self.hideKeyboardWhenTappedAround()
}
func addObservers(){
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "LoginPressed"), object: nil)
}
func keyboardWillShow(_ notification: NSNotification){
// calling layoutIfNeeded because otherwise text in textfield bounces when animating for some reason
view.layoutIfNeeded()
self.contentCenterConstraint.constant = -50
self.equalWidthConstraint.constant = -30
self.logoTopConstraint.constant = -10
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
}
func keyboardWillHide(_ notification: NSNotification){

view.layoutIfNeeded()
self.contentCenterConstraint.constant = 0
self.equalWidthConstraint.constant = 0
self.logoTopConstraint.constant = 10
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
}
private func setupKeyboardButtons(){
// textfield delegates instellen, dit dient om keyboard actions te kunnen doen
self.emailField.delegate = self
self.emailField.enablesReturnKeyAutomatically = true
self.passwordField.delegate = self
self.passwordField.enablesReturnKeyAutomatically = true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
switch(textField) {
case self.emailField:
self.passwordField.becomeFirstResponder()
break
case self.passwordField:
signInBtn.sendActions(for: .touchUpInside)
break
default:
textField.resignFirstResponder()
break
}
return true
}
// remove observers
override func viewWillDisappear(_ animated: Bool) {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

}

对我有用的解决方案是添加一个布尔值来检查键盘是否"活动",这可能不是最干净的解决方案,但它解决了问题,希望这有助于以防其他人遇到这种情况。

最新更新