Ограничения не обновляются при появлении клавиатуры - PullRequest
0 голосов
/ 27 августа 2018

Я делаю экран регистрации и хотел бы обновить несколько верхних привязок, чтобы при появлении клавиатуры константа верхнего привязки уменьшалась и клавиатура не закрывала текстовые поля.

Я создал переменную topConstant:

var constraintConstant: CGFloat = 35

И настроил мои взгляды следующим образом:

view.addSubview(passwordTextField)
passwordTextField.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 25).isActive = true
passwordTextField.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -25).isActive = true
passwordTextField.heightAnchor.constraint(equalToConstant: 50).isActive = true
passwordTextField.topAnchor.constraint(equalTo: emailTextField.bottomAnchor, constant: constraintConstant).isActive = true

Тогда я написал этот код:

func textFieldDidBeginEditing(_ textField: UITextField) {
    constraintConstant = 15
    view.layoutIfNeeded()
}

Я не уверен, почему константы не обновляются. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Хорошо. У меня была эта проблема, когда я впервые начал на iOS с Swift. Видите, проблема в вашем понимании якорей.

Указанная вами константа не работает так, как вы ожидаете. (Вы ожидаете, что он будет функционировать как некий слушатель, который будет продолжать обновляться в зависимости от обновления значения переменной. Это не так). Он просто примет значение переменной во время установки и затем не будет выглядеть назад, если вы не получите доступ к этому якору и измените константу вручную.

Именно поэтому вы должны сохранить экземпляр якоря и вручную изменить константу следующим образом.

Определить переменную ограничения:

var topAnchorConstraint: NSLayoutConstraint!

Сохранить соответствующее ограничение в переменной

topAnchorConstraint = passwordTextField.topAnchor.constraint(equalTo: emailTextField.bottomAnchor, constant: 35)
topAnchorConstraint.isActive = true

Теперь вам нужно изменить константу по мере необходимости.

func textFieldDidBeginEditing(_ textField: UITextField) {
    UIView.animate(withDuration: 1.0, animations: {
        self.topAnchorConstraint.constant = 15
        self.view.layoutIfNeeded()

    }, completion: nil)
}
0 голосов
/ 27 августа 2018

Вам нужно

var topCon:NSLayoutConstraint!

//

topCon = passwordTextField.topAnchor.constraint(equalTo: emailTextField.bottomAnchor, constant: constraintConstant)
topCon.isActive = true

//

func textFieldDidBeginEditing(_ textField: UITextField) {
    topCon.constant = 15
    view.layoutIfNeeded()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...