UIScrollViewKeyboardDismissModeInteractive用键盘改变tableview的高度
在一个UIViewController
我设置self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive
。
这很好,因为用户可以从桌面视图拖动键盘。
但是,当拖动键盘时,tableview保持当前的高度。 这看起来很奇怪,因为它留下了键盘和滚动视图之间的空白空间。
我如何持续跟踪键盘的框架,以便在用户拖动键盘时调整tableview的大小? 我试过使用UIKeyboardWillChangeFrameNotification
但似乎只有在用户完成拖动后才能调用。
你的桌子视图不应该改变它的高度来容纳键盘。
相反,键盘应显示在表视图的上方,并且您应该调整表视图上的contentInset
和scrollIndicatorInsets
属性,以便低级表内容不被键盘遮挡。 当键盘出现或被解除时,您需要更新滚动插入。
当键盘被交互式解除时,不必做任何特殊的事情,因为当键盘移出视图时,表格内容应该已经向下滚动。
我宁愿这不是被接受的答案,但是对于那些在这里也遇到麻烦的人来说,这对我来说是有效的。
-
创build一个UIView的自定义子类。
-
在子类的
willMoveToSuperview:
方法中,将一个KVO观察者添加到iOS 8的willMoveToSuperview:
视图center
,并在较小版本的iOS上frame
(记住要移除旧的观察者,您可能希望使用实例variables来跟踪这个)。 -
在你的视图控制器中,通过
inputAccessoryView
类覆盖向视图控制器添加一个0.0高度的input附件视图。 使用您的自定义UIView
子类为此。 -
回到子类中,在
observeValueForKeyPath:...
,捕获视图的observeValueForKeyPath:...
视图的frame
,这应该是UIKeyboard
的框架。 -
使用
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: ¢erContext) } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { //print("CHANGE",keyPath) if context == ¢erContext { 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) } } }