-1

在我的聊天应用程序textFieldDidBeginEditing中自动添加键盘高度,IQKeyboardManager但它会将整个屏幕滚动到顶部。我要求只滚动 tableView 的内容。我navigationBar应该保持在顶部,但使用第三方滚动库(IQKeyboardManager)将所有部分滚动到顶部。那么我怎样才能只滚动tableView内容呢?

4

1 回答 1

1

在你的ChatViewController你可以禁用IQKeyboardManager.

override func viewWillAppear(_ animated: Bool) {
   super.viewWillAppear(animated)
   IQKeyboardManager.shared().isEnabled = false
   IQKeyboardManager.shared().isEnableAutoToolbar = false
}

当您要像这样离开该视图控制器时,您可以重新启用它。

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    IQKeyboardManager.shared().isEnabled = true
    IQKeyboardManager.shared().isEnableAutoToolbar = true
}

现在我们禁用了,IQKeyboardManager我们必须自己管理键盘。

为此,您可以尝试以下方法。

override func viewDidLoad() {
    super.viewDidLoad()
    prepareTableView()
    observeKeyboardEvents()
}

在这里你调用observeKeyboardEvents方法中的viewDidLoad方法。

private func observeKeyboardEvents() {
    NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: nil) { [weak self] (notification) in
        guard let keyboardHeight = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
        print("Keyboard height in KeyboardWillShow method: \(keyboardHeight.height)")
        self?.tableView.contentInset.bottom = keyboardHeight.height + 8
        self?.tableView.scrollIndicatorInsets.bottom = keyboardHeight.height + 8
        }

     NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: nil) { [weak self] (notification) in
         self?.tableView.scrollIndicatorInsets.bottom = 0 + 8
         self?.tableView.contentInset.bottom = 0 + 8
     }
}

observeKeyboardEvents方法中,您注册此视图控制器以观察键盘AppearDisappear通知并相应地调整您tableViewcontentInset.bottom。所以我们也应该移除这个视图控制器来停止接收键盘事件通知。为此,您可以尝试以下代码。

deinit {
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
}

希望,这可能对你有所帮助。:)

于 2019-09-14T10:23:23.903 回答