【问题标题】:UIScrollViewKeyboardDismissModeInteractive changing tableview height with keyboardUIScrollViewKeyboardDismissModeInteractive 使用键盘更改表格视图高度
【发布时间】:2014-12-18 21:46:06
【问题描述】:

UIViewController 内我已设置 self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive.

这很棒,因为用户可以从 tableview 向下拖动键盘。

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

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

【问题讨论】:

    标签: ios objective-c uitableview uikit uikeyboard


    【解决方案1】:

    您的表格视图不应更改其高度以适应键盘。

    相反,键盘应该出现在表格视图的上方,并且您应该调整表格视图上的contentInsetscrollIndicatorInsets 属性,以便下方的表格内容不会被键盘遮挡。每当出现或关闭键盘时,您都需要更新滚动插图。

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

    【讨论】:

    • 哇,这有记录吗?提前知道会很有帮助。不幸的是,在我的情况下,表格视图和键盘之间还有一个额外的视图。根据一组特定条件,表格视图将覆盖此视图或调整其高度以显示它。我可以重构我的代码,使中间视图从下面弹出,而不是让表格视图覆盖它,但这是一个比我目前有时间做的更大的重构。不管怎样,谢谢你的回答。
    【解决方案2】:

    我宁愿这不是公认的答案,但对于那些也有这个问题的人来说,这对我有用。

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

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

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

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

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

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

    【讨论】:

    • 显示一些代码,我不知道如何添加观察者
    【解决方案3】:

    这就是我想出的,我使用委托的通知:

    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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多