繁体   English   中英

Swift 4.2在键盘显示时使tableView的底部向上移动

[英]Swift 4.2 Make bottom of tableView move up when keyboard shows

尽管进行了搜索,但是我对如何最好地解决这个问题感到困惑。

我有一个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。 我是否通过这种方法使Navigationview不透明?

一种解决方案(我有时使用)只是在键盘出现/消失时更改tableView的内容偏移量。 我相信这将在您的实例中起作用,而不是像您提到的UIViewControllerUITableViewController那样改变tableView的约束。 我的建议请参见以下代码,希望对您有所帮助!

处理通知:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM