【问题标题】:How to make table view inside a container view to not bounce on keyboard popup?如何使容器视图中的表格视图不会在键盘弹出窗口中反弹?
【发布时间】:2019-11-08 14:51:04
【问题描述】:

我有一个静态表视图控制器,其中一个单元格是一个容器视图,它具有另一个动态表视图。内部表格视图有一个文本字段,当点击时,键盘会弹出。在主(外部)表视图控制器中,我有以下函数来更新键盘显示的约束。

func updateConstraints() {
    let bottom: CGFloat = 0
    if let popup = self.addItemPopupView {
        self.popupBottomContraints?.isActive = false
        if self.isKeyboardActive {
            self.popupBottomContraints = popup.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
                                                                       constant: -self.keyboardHeight+bottom)
        } else {
            self.popupBottomContraints = popup.bottomAnchor.constraint(equalTo: self.toolbar.topAnchor, constant: bottom)
        }
        self.popupBottomContraints?.isActive = true
    }
}

但问题在于,在键盘显示上,内部表格视图会跳转到容器视图内的顶部,而主视图控制器本身会移动到顶部。如何防止内表视图根本不动?我为表格视图禁用了滚动、弹跳,但它仍然会发生。


外部表格单元格的动态高度设置为内部表格视图的内容高度,因此无需滚动。

See the video

【问题讨论】:

  • 在键盘关闭的情况下,内部表格视图的行为是什么?
  • 键盘关闭时,没有问题,没有跳来跳去。主视图只是向下滑动。

标签: ios swift uitableview uicontainerview


【解决方案1】:

对你的代码做了一些修改

**replace** self.view.safeAreaLayoutGuide.bottomAnchor **to** self.toolbar.topAnchor. 


func updateConstraints() {
    let bottom: CGFloat = 0
    if let popup = self.addItemPopupView {
        self.popupBottomContraints?.isActive = false
        if self.isKeyboardActive {
            self.popupBottomContraints = popup.bottomAnchor.constraint(equalTo: self.toolbar.topAnchor,
                                                                       constant: -self.keyboardHeight+bottom)
        } else {
            self.popupBottomContraints = popup.bottomAnchor.constraint(equalTo: self.toolbar.topAnchor, constant: bottom)
        }
        self.popupBottomContraints?.isActive = true
    }
}

【讨论】:

  • 只需注释 updateConstraints 方法,然后运行,然后让我知道 innerTable 视图的行为
  • 我试过了,还是一样的问题。我将视频记录附加到问题中,并启用了约束。
  • 问题不在 updateConstraints 中,它在您的内部 tableView 中。
  • 当用户点击文本框时你做了什么?
  • 我有 func textViewDidBeginEditing(_ textView: UITextView) { self.isHeaderEditing = true; self.tableView.reloadData(); } 作为委托方法。
【解决方案2】:

我通过删除容器视图并直接在主视图控制器中使用表视图来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多