Синхронизируйте анимацию UIView с анимацией клавиатуры - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть UIView, который изменит его height и положение в зависимости от того, что он всегда «прилипает» к клавиатуре. Проблема в том, что при смене textField появляется анимация asynchronous, остальное работает нормально. Вот видео для лучшего понимания:

Анимация

Это происходит, даже если я использовал UIResponder.keyboardAnimationCurveUserInfoKey для анимации.

Вот все части моего кода, где я animate:

Обработчик уведомлений в ViewController:

var keyboardHeight = CGFloat(0)
var duration: Any?
var curve: NSNumber?
//MARK: keyboardWillShow
@objc func keyboardWillShow(_ notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        self.keyboardHeight = keyboardRectangle.height

        let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey]
        self.duration = duration
        let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey]
        self.curve = curve as? NSNumber

        if self.wishViewIsVisible {
            UIView.animate(withDuration: self.duration as! TimeInterval, delay: 0, options: UIView.AnimationOptions(rawValue: UIView.AnimationOptions.RawValue(truncating: self.curve!)), animations: {
                        self.wishConstraint.constant = -(self.wishView.frame.height + self.keyboardHeight)
                        self.view.layoutIfNeeded()
                    }, completion: nil)
        }
    }
}

Закрывающий обработчик в ViewController:

self.wishView.onPriceButtonTapped = { [unowned self] height, isHidden in

        if isHidden {
            UIView.animate(withDuration: self.duration as! TimeInterval, delay: 0, options: UIView.AnimationOptions(rawValue: UIView.AnimationOptions.RawValue(truncating: self.curve!)), animations: {
                self.wishConstraint.constant -= height
                self.wishView.priceTextField.becomeFirstResponder()
                self.view.layoutIfNeeded()
            }, completion: nil)

        } else {
            UIView.animate(withDuration: self.duration as! TimeInterval, delay: 0, options: UIView.AnimationOptions(rawValue: UIView.AnimationOptions.RawValue(truncating: self.curve!)), animations: {
                self.wishConstraint.constant += height
                self.wishView.wishNameTextField.becomeFirstResponder()
                self.view.layoutIfNeeded()
            }, completion: nil)
        }  
    }

Закрытие внутри UIView:

@objc func priceButtonTapped(){

    let priceViewIsHidden = priceView.isHidden

    if priceViewIsHidden {
        UIView.animate(withDuration: 0.25) {
            self.priceView.alpha = 1
            self.priceView.isHidden = false
            self.theStackView.layoutIfNeeded()
        }
        self.onPriceButtonTapped?(priceView.frame.height, true)
    } else {
        UIView.animate(withDuration: 0.25) {
            self.priceView.alpha = 0
            self.priceView.isHidden = true
            self.theStackView.layoutIfNeeded()
        }
        self.onPriceButtonTapped?(priceView.frame.height, false)

    }
}

Кто-нибудь знает, как я могу исправить Эта проблема?

Я знаю, что жестко кодирую values внутри UIView, но это просто для того, чтобы скрыть / показать arrangedSubview внутри StackView, и это не то, где анимация отключена, как вы можно увидеть в видео. Выглядит только при изменении textFields.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...