UIScrollViewKeyboardDismissModeInteractive用键盘更改tableview高度

时间:2014-12-18 21:46:06

标签: ios objective-c uitableview uikit uikeyboard

UIViewController我的套装中 self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive

这很棒,因为用户可以从桌面视图中向下拖动键盘。

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

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

3 个答案:

答案 0 :(得分:7)

您的桌面视图不应更改其高度以容纳键盘。

相反,键盘应显示在表格视图的上方,您应调整表格视图上的contentInsetscrollIndicatorInsets属性,以便键盘不会遮盖下表内容。无论何时出现或解除键盘,都需要更新滚动插入内容。

当键盘以交互方式解除时,您不必执行任何特殊操作,因为当键盘移出视图时,表格内容应该已经向下滚动。

答案 1 :(得分:4)

我认为这不是公认的答案,但对于那些在这里遇到麻烦的人来说,这对我有用。

  1. 创建UIView的自定义子类。

  2. 在子类的willMoveToSuperview:方法中,将KVO观察者添加到iOS 8上的超级视图center和较小版本iOS上的frame (记得删除旧的观察者,你可能想用一个实例变量来跟踪它。)

  3. 在视图控制器中,通过inputAccessoryView类覆盖向视图控制器添加0.0高度输入附件视图。使用您的自定义UIView子类。

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

  5. 使用NSNotificationCenter或其他方法将此frame传递回您的视图控制器进行处理。

  6. 这是一个非常痛苦的过程,并不能保证在未来版本的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: &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)
        }
    }
}