Проблема с вычислением размера клавиатуры и уменьшением высоты просмотра, когда клавиатура поднята - PullRequest
0 голосов
/ 10 мая 2019

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

Вот скриншот: (Я создал scrollView внутри родительского представления контроллера, поэтому, когда клавиатура включена, пользователь может прокрутить всю страницу) enter image description here

Проблема:

1 - высота клавиатуры иногда неверна, зависит от того, как я подключаю нижнее ограничение scrollView.

2 - иногда это должно давать нижнему ограничению scrollView отрицательное значение, чтобы уменьшить scrollView, а иногда ему нужно положительное значение! Это также зависит от того, как вы соединяете нижнее ограничение scrollView с его superView (именно поэтому я создал переменную isReverse).

вот мое расширение:

extension UIViewController {

func watchKeyboard() {
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc private func keyboardWillShow(notification: NSNotification) {
    let isReverse = true // in some case you should turn this boolean to false to get the proper result.
    if tabBarController != nil {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if let bottomConstraint = view.constraints.filter({ $0.firstAttribute == .bottom }).first {
                UIView.animate(withDuration: 0.4) {
                    if isReverse {
                        bottomConstraint.constant = -keyboardSize.height + self.tabBarController!.tabBar.frame.size.height
                    } else {
                        bottomConstraint.constant = keyboardSize.height - self.tabBarController!.tabBar.frame.size.height
                    }
                    self.view.layoutIfNeeded()
                }
            }
        }
    } else {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let isReverse = true // in some case you should turn this boolean to false to get the proper result.
            if let bottomConstraint = view.constraints.filter({ $0.firstAttribute == .bottom }).first {
                UIView.animate(withDuration: 0.4) {
                    bottomConstraint.constant = isReverse ? -keyboardSize.height : keyboardSize.height
                    self.view.layoutIfNeeded()
                }
            }
        }
    }
}

@objc private func keyboardWillHide(notification: NSNotification) {
    if let bottomConstraint = view.constraints.filter({ $0.firstAttribute == .bottom }).first {
        UIView.animate(withDuration: 0.4) {
            bottomConstraint.constant = 0
            self.view.layoutIfNeeded()
        }
    }
}
}

Заранее спасибо ...

...