2017-04-08 4 views
1

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

}

答えて

0

私はそれはきれいな解決策ではないかもしれない、ちょうどキーボードが「アクティブ」であるかどうかをチェックするブール値を追加することでしたが、それは問題を修正するために働いたソリューション、他の誰かがこの問題を抱えている場合に役立ちますように。

関連する問題