キーボードが表示されているときに制約の変更に問題があります。 私は現在、ログイン画面を構築しています。ここでは、フレーム内に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)
}
}