keyboardWillShowNotification вызывается дважды при закрытии

Я подписался на keyboardWillShowNotification и keyboardWillHideNotification, чтобы перемещаться по моему пользовательскому интерфейсу. Я заметил, что, когда я отключаю клавиатуру, нажимая кнопку «Go», keyboardWillShowNotification вызывается дважды (таким образом сбрасывая некоторые из моих ограничений), однако если отклонить нажатием return на клавиатуре (MacBook), он не вызывается дважды.

Как мне избежать двойного вызова? Почему такое поведение вообще существует? Я не могу найти упоминания о нем (много ссылок на него дважды вызывается с входными представлениями ... и т. Д.), Но никогда не было отклонено.

Вот мой код:

override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasDismissed(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) 
}

и...

@objc func keyboardNotification(notification: NSNotification) {
        guard
            let animationDuration = notification.userInfo?["UIKeyboardAnimationDurationUserInfoKey"] as? Double,
            let animationCurve = notification.userInfo?["UIKeyboardAnimationCurveUserInfoKey"] as? NSNumber,
            let frameEnd = notification.userInfo?["UIKeyboardFrameEndUserInfoKey"] as? CGRect,
            let frameBegin = notification.userInfo?["UIKeyboardFrameBeginUserInfoKey"]
            else {
                print("No userInfo recived from NSNotification.Name.UIKeyboardWillShow")
                return
        }
        print("WILL SHOW")

        let margin = self.view.safeAreaLayoutGuide
        constraintsWhenKeyboardVisible = [
                            boxOffice.leadingAnchor.constraint(equalTo: margin.leadingAnchor),
                            boxOffice.trailingAnchor.constraint(equalTo: margin.trailingAnchor),
                            boxOffice.bottomAnchor.constraint(equalTo: margin.bottomAnchor),
                            boxOffice.topAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -(frameEnd.height + 50))
                        ]
        NSLayoutConstraint.deactivate(boxOfficeFinalConstraints)
        NSLayoutConstraint.activate(constraintsWhenKeyboardVisible)

        UIView.animate(withDuration: animationDuration,
                       delay: TimeInterval(0),
                       options: UIView.AnimationOptions(rawValue: animationCurve.uintValue),
                       animations: {
                        self.boxOffice.answerField.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
                        self.view.layoutIfNeeded()
        },
                       completion: nil)
    }


@objc func keyboardWasDismissed(notification: NSNotification) {
        guard
            let animationDuration = notification.userInfo?["UIKeyboardAnimationDurationUserInfoKey"] as? Double,
            let animationCurve = notification.userInfo?["UIKeyboardAnimationCurveUserInfoKey"] as? NSNumber
            else {
                print("No userInfo recived from NSNotification.Name.UIKeyboardWillShow")
                return
        }
        print("WILL HIDE")
        //print(notification)
        NSLayoutConstraint.deactivate(self.constraintsWhenKeyboardVisible)
        NSLayoutConstraint.activate(self.boxOfficeFinalConstraints)

        UIView.animate(withDuration: animationDuration,
                       delay: TimeInterval(0),
                       options: UIView.AnimationOptions(rawValue: animationCurve.uintValue),
                       animations: {
                        self.boxOffice.answerField.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]
                        self.view.layoutIfNeeded()
        },
                       completion: nil)

    }

person Bwgan    schedule 11.06.2018    source источник
comment
покажите, как вы подписались на уведомления и где?   -  person Mahendra    schedule 11.06.2018
comment
Я добавил наблюдателей в viewDidLoad - я также попробовал viewDidAppear, но без изменений   -  person Bwgan    schedule 11.06.2018
comment
попробуйте зарегистрироваться в viewWillAppear () после вызова super.viewWillAppear ()   -  person Carl    schedule 02.10.2018
comment
Вы нашли какое-то решение для этого?   -  person Nitkarsh Gupta    schedule 13.01.2021
comment
См. Мой ответ ниже. Я добавлял ограничения с каждым уведомлением, я исправлял это простым изменением существующих.   -  person Bwgan    schedule 15.01.2021


Ответы (1)


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

boxOfficeWhenKeyboardVisible[3].constant = -(frameEnd.height + 50)
person Bwgan    schedule 12.06.2018