我发现在我的许多重构中,我继承自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
}
答案 0 :(得分:0)
切换到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
}
我设法达到了同样的效果。我不确定这是否是正确的方法,但它运行良好。我很想知道可能有哪些其他解决方案。
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
}