Pau*_*aul 5 keyboard scroll uitableview uiscrollview ios
我发现在许多重构中,我继承自UIViewController而不是UITableViewController,因此我缺少UITableViewController提供的一些自动行为。但是,在交互式关闭键盘时,我仍然需要手动处理滚动视图插图。看到我更新的答案。
我正在尝试模拟iMessage,当用户将其拖到屏幕底部时如何关闭键盘。我可以解决一个困扰我的小视觉问题。
当将键盘从屏幕上拖动时,滚动指示器无法正确调整大小-直到完全将其关闭为止。
我使用键盘通知来告诉我何时出现键盘以增加内容并按键盘高度滚动插图。取消键盘后,似乎不需要执行任何操作,因为插入时似乎正确。但是,以交互方式关闭时,在拖动事件期间我无法更新插图。
为了说明问题,第一个图像显示由于键盘占用了空间,因此内容已滚动到屏幕顶部之外。用户已滚动到表格的最后一行:

在这里,键盘被关闭了,几乎完全不在屏幕上。但是,请注意滚动指示器的尺寸完全错误。现在所有内容几乎都在屏幕上,因此指示器应该伸展,但是,发生的情况是,当键盘向下移动时,滚动指示器向上移动而不伸展。这不是iMessage中发生的情况。

我认为我的工作很标准,我正在创建UIToolBar(iOS 8.3)并在我的视图控制器中覆盖以下方法:
override var inputAccessoryView: UIView {
return toolbar
}
override func canBecomeFirstResponder() -> Bool {
return true
}
func willShowKeyboard(notification: NSNotification) {
let keyboardFrame = notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
tableView.contentInset.bottom = keyboardFrame.CGRectValue().height
tableView.scrollIndicatorInsets.bottom = keyboardFrame.CGRectValue().height
}
Run Code Online (Sandbox Code Playgroud)
切换到 a 后UITableViewController,我发现这种实现scrollViewDidScroll()(以及下面原始解决方案中的其他方法)实现了当键盘交互式关闭时动态调整插图大小的技巧。
override func scrollViewDidScroll(scrollView: UIScrollView) {
if !keyboardShowing {
return
}
let toolbarFrame = toolbar.convertRect(toolbar.frame, toView: nil)
tableView.scrollIndicatorInsets.bottom = view.bounds.height - toolbarFrame.minY
tableView.contentInset.bottom = view.bounds.height - toolbarFrame.minY
}
Run Code Online (Sandbox Code Playgroud)
我已经达到了同样的效果。我不确定这是否是正确的方法,但效果很好。我有兴趣知道可能还有哪些其他解决方案。
func didShowKeyboard(notification: NSNotification) {
let keyboardFrame = notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
let keyboardHeight = keyboardFrame.CGRectValue().height
tableView.contentInset.bottom = keyboardHeight
tableView.scrollIndicatorInsets.bottom = keyboardHeight
keyboardShowing = true
}
func didHideKeyboard(notification: NSNotification) {
keyboardShowing = false
}
func scrollViewDidScroll(scrollView: UIScrollView) {
if !keyboardShowing {
return
}
let toolbarFrame = view.convertRect(toolbar.frame, fromView: toolbar)
tableView.scrollIndicatorInsets.bottom = view.bounds.height - toolbarFrame.minY
tableView.contentInset.bottom = view.bounds.height - toolbarFrame.minY
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3300 次 |
| 最近记录: |