在Swift中使用自动布局显示键盘时,保持TableView底部可见

时间:2018-10-23 16:39:37

标签: ios swift keyboard tableview

我有一个带有textview的表格视图,用于在其下方立即输入文本,类似于Apple Messages。当用户开始输入文本并出现键盘时,我希望出现类似于IOS消息的行为。

  1. 如果键盘不会覆盖任何东西,则表视图的可见部分将保持不变。

  2. 如果键盘将覆盖某些东西,则表视图将向上移动足够一点,以使其最底部填充的单元格位于键盘上方。

因为我使用的是自动布局,所以我目前在表视图和它下面的文本视图之间有一个约束。此外,该项目还有IQKeyboard,它可以管理许多其他涉及文本字段和文本视图的视图。

与IQKeyboard结合使用的约束完成2。当键盘出现时,键盘将textview向上推。文本视图将表格视图向上推。因此,如果完全填充了表格视图,则可以根据需要在键盘上方的文本视图上方看到表格视图的最后一个单元格。

但是,2.无法正常工作。

如果未填充表格视图,则键盘会向上推文本视图,从而将表格视图向上推,以便您可以再一次看到表格视图的顶部。

当键盘显示和此类工作时,我曾尝试调整tableview的contentOffset属性,但是tableview最初先向上移动,然后再向下移动。我认为这是因为直到键盘开始向上移动之后,才会触发更改offset属性的通知。

我还尝试将tableview的高度调整为其内容,但这会导致textview由于约束而扩展以填充差异。

Content offset approach - problem is that content offset adjusts too late
//register for keyboard notifications and in handler:
if let infoKey  = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
   let rawFrame = (infoKey as AnyObject).cgRectValue {
     let keyboardFrame = view.convert(rawFrame, from: nil)
     self.heightKeyboard = keyboardFrame.size.height
     UIView.animate(withDuration: 0.2, animations: {
             self.tableView.contentInset = UIEdgeInsetsMake(self.heightKeyboard!, 0, 0, 0);
     })
}

有人能建议一种模仿Apple Messages行为的方法吗?预先感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

一种方法:

  • 将tableView的顶部限制为视图的顶部
  • 将tableView的底部限制为textField的顶部
  • 将textField的底部限制为视图的底部
  • 为textField的底部约束创建一个@IBOutlet

显示键盘时,将textField底部约束的.constant更改为键盘视图的高度。

这将使textField向上移动,并且因为它的顶部被限制在tableView的底部,所以也会将tableView的底部边缘向上移动。

然后滚动到tableView的底部。

布局:

enter image description here

具有20行(滚动到底部)的初始层次结构:

enter image description here

层次结构视图(tableView背景颜色设置为绿色,因此我们可以看到其框架):

enter image description here

显示键盘后的视图:

enter image description here

显示键盘后的层次结构:

enter image description here

从静态屏幕截图上很难看到,但是绿色矩形(tableView背景)的框架现在更短了……用户仍然可以上下滚动以查看所有行,但是tableView的底部仍然限制在textField的顶部。

关闭键盘后,将textField底部约束的.constant设置为零。

您可以在GitHub上看到完整的有效示例项目:https://github.com/DonMag/KBAdjust