【问题标题】:IQKeyboardManager scrolls whole screen but want to scroll only tableview contentIQKeyboardManager 滚动整个屏幕,但只想滚动 tableview 内容
【发布时间】:2020-01-15 22:48:27
【问题描述】:

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

【问题讨论】:

    标签: ios swift iphone iqkeyboardmanager


    【解决方案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()
    }
    

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

    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)
    }
    

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

    【讨论】:

    • 我已经尝试过相同的方法,但现在我的文本字段没有向上移动,并且该用户无法检查输入的消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多