swift - 更改键盘动画弹跳的 Storyboard约束

标签 swift xcode swift3 keyboard constraints

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

当键盘出现时,我想为约束设置动画以将堆栈 View 和 Logo 向上移动一点,这样键盘就不会覆盖任何东西。

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

问题 我现在遇到的是,每次我按“下一步”或清除文本字段时,约束都会再次改变,因此堆栈 View 和 Logo 会“跳动”,这有点烦人。另外,我知道很多人可能会建议使用 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)
}

最佳答案

对我有用的解决方案是添加一个 bool 值来检查键盘是否“事件”,它可能不是最干净的解决方案,但它解决了问题,希望这有助于以防其他人遇到这个。

关于swift - 更改键盘动画弹跳的 Storyboard约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294300/

相关文章:

ios - 在 Swift 中禁用按钮

swift 5.0 : 'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(. ..)

ios - Xcode 要求我将属性重新声明为实例变量

ios - 根据计数重复一张图片

ios - 推送新的 View Controller 时,自定义导航栏 subview 不会隐藏

javascript - 在 Javascript 中使用 Swift 的 self 访问 Swift 类变量和函数

swift - Couchbase 接收 channel 空

ios - Swift3 中的 "Cannot convert value of type"错误

swift - 将 [Dictionary<String,Any?>] 转换为 [Dictionary<String,Any!>] ? swift 3

Swift 3 - 使用 DispatchGroup() 等待每个 URL session 完成?