在 Swift 中使用自动布局显示键盘时保持 TableView 底部可见
Keep Bottom of TableView Visible When Keyboard Shows With Autolayout in Swift
我有一个带有文本视图的表格视图,用于在其正下方输入文本,类似于 Apple Messages。当用户开始输入文本并出现键盘时,我希望出现类似于 IOS Messages.
的以下行为
如果键盘不会覆盖任何东西,tableview 的可见部分保持不变。
如果键盘会遮住某些东西,tableview 会向上移动,使其最底部填充的单元格刚好在键盘上方。
因为我使用的是自动布局,所以我目前在 tableview 和它下面的 textview 之间有一个约束。此外,该项目还有 IQKeyboard,它管理许多涉及文本字段和文本视图的其他视图。
结合IQKeyboard的约束完成2.当键盘出现时,键盘将textview往上推。 textview 将 tableview 向上推。因此,如果表格视图已完全填充,您会根据需要在键盘上方的文本视图上方看到表格视图的最后一个单元格。
但是,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 的顶部约束到视图的顶部
- 将 tableView 的底部限制在 textField 的顶部
- 将文本字段的底部限制在视图的底部
- 为文本字段的底部约束创建一个
@IBOutlet
显示键盘时,将 textField 底部约束的 .constant
更改为键盘视图的高度。
这会将 textField 向上移动,并且因为它的顶部被限制在 tableView 的底部,所以它也会向上移动 tableView 的底部边缘。
然后滚动到 tableView 的底部。
布局:
初始层次结构,20 行(滚动到底部):
层级视图(tableView背景颜色设置为绿色,所以我们可以看到它的框架):
显示键盘后的视图:
显示键盘后的层次结构:
从静态屏幕上看有点困难,但绿色矩形的框架(tableView 背景)现在更短了......用户仍然可以上下滚动以查看所有行,但底部tableView 仍然被限制在 textField 的顶部。
关闭键盘后,将 textField 底部约束的 .constant
设置回零。
您可以在 GitHub 上看到完整的工作示例项目:https://github.com/DonMag/KBAdjust
我有一个带有文本视图的表格视图,用于在其正下方输入文本,类似于 Apple Messages。当用户开始输入文本并出现键盘时,我希望出现类似于 IOS Messages.
的以下行为如果键盘不会覆盖任何东西,tableview 的可见部分保持不变。
如果键盘会遮住某些东西,tableview 会向上移动,使其最底部填充的单元格刚好在键盘上方。
因为我使用的是自动布局,所以我目前在 tableview 和它下面的 textview 之间有一个约束。此外,该项目还有 IQKeyboard,它管理许多涉及文本字段和文本视图的其他视图。
结合IQKeyboard的约束完成2.当键盘出现时,键盘将textview往上推。 textview 将 tableview 向上推。因此,如果表格视图已完全填充,您会根据需要在键盘上方的文本视图上方看到表格视图的最后一个单元格。
但是,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 的顶部约束到视图的顶部
- 将 tableView 的底部限制在 textField 的顶部
- 将文本字段的底部限制在视图的底部
- 为文本字段的底部约束创建一个
@IBOutlet
显示键盘时,将 textField 底部约束的 .constant
更改为键盘视图的高度。
这会将 textField 向上移动,并且因为它的顶部被限制在 tableView 的底部,所以它也会向上移动 tableView 的底部边缘。
然后滚动到 tableView 的底部。
布局:
初始层次结构,20 行(滚动到底部):
层级视图(tableView背景颜色设置为绿色,所以我们可以看到它的框架):
显示键盘后的视图:
显示键盘后的层次结构:
从静态屏幕上看有点困难,但绿色矩形的框架(tableView 背景)现在更短了......用户仍然可以上下滚动以查看所有行,但底部tableView 仍然被限制在 textField 的顶部。
关闭键盘后,将 textField 底部约束的 .constant
设置回零。
您可以在 GitHub 上看到完整的工作示例项目:https://github.com/DonMag/KBAdjust