在UIViewController
我的套装中
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive
。
这很棒,因为用户可以从桌面视图中向下拖动键盘。
然而,当拖动键盘时,tableview会保持它的当前高度。这看起来很奇怪,因为它在键盘和滚动视图之间留下了空白区域。
如何持续跟踪键盘的框架,以便在用户拖动键盘时调整tableview的大小?我尝试使用UIKeyboardWillChangeFrameNotification
,但似乎只有在用户完成拖动后才会调用。
答案 0 :(得分:7)
您的桌面视图不应更改其高度以容纳键盘。
相反,键盘应显示在表格视图的上方,您应调整表格视图上的contentInset
和scrollIndicatorInsets
属性,以便键盘不会遮盖下表内容。无论何时出现或解除键盘,都需要更新滚动插入内容。
当键盘以交互方式解除时,您不必执行任何特殊操作,因为当键盘移出视图时,表格内容应该已经向下滚动。
答案 1 :(得分:4)
我认为这不是公认的答案,但对于那些在这里遇到麻烦的人来说,这对我有用。
创建UIView的自定义子类。
在子类的willMoveToSuperview:
方法中,将KVO观察者添加到iOS 8上的超级视图center
和较小版本iOS上的frame
(记得删除旧的观察者,你可能想用一个实例变量来跟踪它。)
在视图控制器中,通过inputAccessoryView
类覆盖向视图控制器添加0.0高度输入附件视图。使用您的自定义UIView
子类。
返回子类,在observeValueForKeyPath:...
中,捕获视图的超级视图的frame
,这应该是UIKeyboard
的框架。
使用NSNotificationCenter
或其他方法将此frame
传递回您的视图控制器进行处理。
这是一个非常痛苦的过程,并不能保证在未来版本的iOS中工作。自从我刚建好之后,很可能会出现大量的边缘情况,但这是一个好的开始。如果有人有更好的想法,我会乐意将你的答案标记为正确。
答案 2 :(得分:1)
这是我提出的,使用通知我使用委托:
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)
}
}
}