2017-04-08 55 views
1

我遇到显示键盘时更改约束的问题。 我目前正在建立一个登录屏幕,我已经设置了约束,以在框架中水平和垂直居中一个具有2个文本框和一个按钮的堆栈视图。徽标(imageview)位于堆栈视图之上,并具有独立的约束。更改键盘动画反弹的故事板约束

当键盘出现时,我想动画的约束来移动stackview和标志了一下,所以键盘不包括任何东西。

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

问题我现在有的是,每次按下“下一步”或清除文本框,约束再次改变,从而stackview和徽标“反弹”,这有点烦人。另外,我知道很多人可能会使用scrollview进行提示,但这不是真正的选择。 我也有底部的按钮来创建一个帐户,所以我也不能真正改变整个框架高度。

我猜测,因为它调用“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) 
} 

}

回答

0

这工作对我来说是只需添加一个布尔值来检查键盘是“主动”与否,它可能不是最干净的解决方案,但它解决了这一问题的解决方案,希望这有助于防止其他人遇到这种情况。