Swift 4.2 Когда клавиатура показывает, нижняя часть tableView перемещается вверх - PullRequest
0 голосов
/ 31 января 2019

Несмотря на то, что я искал, я не уверен, как лучше к этому подойти.

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

Я подумал, что мне нужно изменить физический размер представления таблицы и убедиться, чтокогда клавиатура показывает, прокручивается до конца.

Некоторые говорят, что наблюдатели клавиатуры, но большая часть кода, который я нашел для этого, устарели и содержат ошибки при вводе в Xcode.

NSNotificationCenter Swift 3.0 на клавиатуре показывает и скрывает

Это лучшее, что я могу найти, но я также слышу о ограничениях, используя UITableViewController вместо встраивания UITableView и так далее ...

Это код, который у меня есть на данный момент:

NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)


@objc func keyboardWillShow(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        print("notification: Keyboard will show")
        if self.view.frame.origin.y == 0{
            self.view.frame.origin.y -= keyboardSize.height
        }
    }

}

@objc func keyboardWillHide(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y += keyboardSize.height
        }
    }
}

Я думаю, это перемещает весь вид вверх, что означает, что безопасные области (такие как панель навигации и т. Д.) Имеют TableView под ними.Я делаю навигационное представление непрозрачным в этом подходе?

1 Ответ

0 голосов
/ 31 января 2019

Одно из решений (которое я иногда использую) - просто изменить смещение содержимого tableView, когда клавиатура появляется / исчезает.Я считаю, что это будет работать в вашем случае, в отличие от изменения ограничений tableView, поскольку вы упомянули, что ваш UIViewController - это UITableViewController.Пожалуйста, ознакомьтесь с приведенным ниже кодом для моего предложения, надеюсь, это поможет!

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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

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

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NotificationCenter.default.removeObserver(self)
}

Действия:

@objc func keyboardWillShow(notification: Notification) {
    if let keyboardHeight = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
        print("Notification: Keyboard will show")
        tableView.setBottomInset(to: keyboardHeight)
    }
}

@objc func keyboardWillHide(notification: Notification) {
    print("Notification: Keyboard will hide")
    tableView.setBottomInset(to: 0.0)
}

Расширения:

extension UITableView {

    func setBottomInset(to value: CGFloat) {
        let edgeInset = UIEdgeInsets(top: 0, left: 0, bottom: value, right: 0)

        self.contentInset = edgeInset
        self.scrollIndicatorInsets = edgeInset
    }
}
...