我有一个带有 TextView 的表格 View ,用于在其正下方输入文本,类似于 Apple Messages。当用户开始输入文本并出现键盘时,我想要类似于 IOS Messages 的以下行为。
如果键盘不会覆盖任何东西,tableview 的可见部分保持不变。
如果键盘会遮住某些东西,tableview 会向上移动,使其最底部的填充单元格刚好位于键盘上方。
因为我使用的是自动布局,所以我目前在 tableview 和它下面的 textview 之间有一个约束。此外,该项目还有 IQKeyboard,它管理许多涉及文本字段和 TextView 的其他 View 。
约束结合IQKeyboard完成2.当键盘出现时,键盘将textview往上推。 textview 将 tableview 向上推。因此,如果表格 View 已完全填充,您会根据需要在键盘上方的 TextView 上方看到表格 View 的最后一个单元格。
但是,2. 不起作用。
如果 tableview 没有被填满,键盘会向上推 textview,textview 会向上推 tableview,这样您就再也看不到 tableview 的顶部了。
我已经尝试在键盘显示时调整 tableview 的 contentOffset 属性,并且这种方法有效,但 tableview 最初向上移动,然后再返回。我认为这是因为直到键盘开始向上移动后才会触发更改偏移属性的通知。
我还尝试将 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 行为的方法?提前感谢您的任何建议。
最佳答案
一种方法:
- 将 tableView 的顶部约束到 View 的顶部
- 将 tableView 的底部限制在 textField 的顶部
- 将 textField 的底部限制在 View 的底部
- 为文本字段的底部约束创建一个
@IBOutlet
显示键盘时,将 textField 底部约束的 .constant
更改为键盘 View 的高度。
这会将 textField 向上移动,并且因为它的顶部被限制在 tableView 的底部,所以它也会向上移动 tableView 的底部边缘。
然后滚动到 tableView 的底部。
布局:
初始层次结构,有 20 行(滚动到底部):
层级 View (tableView 背景颜色设置为绿色,所以我们可以看到它的框架):
显示键盘后的 View :
显示键盘后的层次结构:
从静态屏幕上看有点困难,但绿色矩形的框架(tableView 背景)现在更短了......用户仍然可以上下滚动以查看所有行,但 tableView 的底部仍然被限制在 textField 的顶部。
当您关闭键盘时,将 textField 底部约束的 .constant
设置回零。
您可以在 GitHub 上查看完整的工作示例项目:https://github.com/DonMag/KBAdjust
关于ios - 在 Swift 中使用自动布局显示键盘时保持 TableView 的底部可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52953976/