Я пытаюсь анимировать мой UIStackView
, который содержит форму входа в систему всякий раз, когда появляется клавиатура. Я хочу сделать это, только отрегулировав ограничения из моего файла раскадровки.Ограничение размера с помощью анимации клавиатуры
Это мой макет:
Мой код изменяет нижнее ограничение в зависимости от размера клавиатуры.
@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
keyboardHeightLayoutConstraint.isActive = false
}
func keyboardNotification(notification: NSNotification) {
keyboardHeightLayoutConstraint.isActive = true
if let userInfo = notification.userInfo {
let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue
let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
if (endFrame?.origin.y)! >= UIScreen.main.bounds.size.height {
self.keyboardHeightLayoutConstraint?.constant = 0.0
} else {
self.keyboardHeightLayoutConstraint?.constant = (endFrame?.size.height)! + 20
}
UIView.animate(withDuration: duration,
delay: TimeInterval(0),
options: animationCurve,
animations: { self.view.layoutIfNeeded() },
completion: nil)
}
}
В результате он только сокращает размер UIStackView, поскольку верхнее ограничение не позволит ей двигаться вверх, например:
Это связанно с верхним ограничением в мой стек. Удаление этого ограничения решает проблему, но при меньших разрешениях форма может перекрываться с UIImageView
. Есть ли способ обновить это ограничение, чтобы отразить изменения нижнего ограничения?
Это именно то, что я хочу. Означает ли это, что мне нужно ограничение на выходное ограничение и ограничение на верхнюю выходную точку? Допустим, если дно получило +20, верх должен получить -20? Это будет работать без конфликтов ограничений? – Hapeki
Да, это именно то, что я сделал. –
И после этого вы смените изменение, когда спрячете клавиатуру (вычтите 20 снизу и добавьте 20 в верхнюю часть). –