UIScrollViewKeyboardDismissModeInteractive用键盘改变tableview的高度

在一个UIViewController我设置self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive

这很好,因为用户可以从桌面视图拖动键盘。

但是,当拖动键盘时,tableview保持当前的高度。 这看起来很奇怪,因为它留下了键盘和滚动视图之间的空白空间。

我如何持续跟踪键盘的框架,以便在用户拖动键盘时调整tableview的大小? 我试过使用UIKeyboardWillChangeFrameNotification但似乎只有在用户完成拖动后才能调用。

你的桌子视图不应该改变它的高度来容纳键盘。

相反,键盘应显示在表视图的上方,并且您应该调整表视图上的contentInsetscrollIndicatorInsets属性,以便低级表内容不被键盘遮挡。 当键盘出现或被解除时,您需要更新滚动插入。

当键盘被交互式解除时,不必做任何特殊的事情,因为当键盘移出视图时,表格内容应该已经向下滚动。

我宁愿这不是被接受的答案,但是对于那些在这里也遇到麻烦的人来说,这对我来说是有效的。

  1. 创build一个UIView的自定义子类。

  2. 在子类的willMoveToSuperview:方法中,将一个KVO观察者添加到iOS 8的willMoveToSuperview:视图center ,并在较小版本的iOS上frame (记住要移除旧的观察者,您可能希望使用实例variables来跟踪这个)。

  3. 在你的视图控制器中,通过inputAccessoryView类覆盖向​​视图控制器添加一个0.0高度的input附件视图。 使用您的自定义UIView子类为此。

  4. 回到子类中,在observeValueForKeyPath:... ,捕获视图的observeValueForKeyPath:...视图的frame ,这应该是UIKeyboard的框架。

  5. 使用NSNotificationCenter或其他手段,然后将此frame传回您的视图控制器进行处理。

这是一个非常痛苦的过程,不保证在未来的iOS版本中工作。 自从我刚刚构build这个以后,可能会出现大量的边缘案例,但这是一个好的开始。 如果有人有一个更好的主意,我会很乐意将你的答案标记为正确的。

这是我想到的,使用通知我使用委托insted:

 protocol MyCustomViewDelegate { func centerChanged(center: CGPoint) } class MyCustomView: UIView{ private var centerContext = 0 var delegate: MyCustomViewDelegate? override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func willMoveToSuperview(newSuperview: UIView?) { super.willMoveToSuperview(newSuperview) guard let newSuperview = newSuperview else { self.superview?.removeObserver(self, forKeyPath: "center") return } let options = NSKeyValueObservingOptions([.New, .Old]) newSuperview.addObserver(self, forKeyPath: "center", options: options, context: &centerContext) } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { //print("CHANGE",keyPath) if context == &centerContext { guard let center = superview?.center else { super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) return } delegate?.centerChanged(center) } else { super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) } } }