【问题标题】:how to move inputView above keyboard when scrolling the table滚动表格时如何在键盘上方移动inputView
【发布时间】:2017-01-05 16:17:57
【问题描述】:

我有一个视图控制器,其中包含 表格视图和表格下方的文本视图

当我点击 textView 时,键盘出现,当我点击 textView 外部时,键盘消失 这很好,但我有一个问题,即当我拖动(向下滚动)表格视图时,textView 不会随键盘向下移动,并且我看到键盘后面的黑色背景,如下图所示

如何在 Swift 中解决这个问题

更新: 这是我当前观察keyboardFrameChanges的代码

func keyboardFrameChanged(notification: NSNotification) {

    let dict = NSDictionary(dictionary: notification.userInfo!)
    let keyboardValue = dict.objectForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue
    let bottomDistance = mainScreenSize().height - keyboardValue.CGRectValue().origin.y
     let duration = Double(dict.objectForKey(UIKeyboardAnimationDurationUserInfoKey) as! NSNumber)

    UIView.animateWithDuration(duration, animations: {
        self.inputViewConstraint!.constant = -bottomDistance
        self.view.layoutIfNeeded()
        }, completion: {
            (value: Bool) in
            self.chatTableView.scrollToBottom(animation: true)
    })

}

更新 2: 我通过将 keyboardDismissMode 从 Interactive 更改为 OnDrag

找到了解决方案
chatTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

一旦观察到表格中的任何拖动移动,这将立即将键盘和 textView 向下移动,但是如何在 Interactive 模式下(如在 whatsapp 聊天视图中)进行操作

【问题讨论】:

    标签: ios swift keyboard


    【解决方案1】:

    您可以使用NSNotificationCenter 观察键盘的框架,并创建一个在框架更改时将调用的方法。在这种方法中,您可以获得键盘的坐标,并可以相应地重新定位您的inputView

    override func viewDidLoad() {
        super.viewDidLoad()
    
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.keyboardDidChangeFrame(_:)), name: UIKeyboardWillChangeFrameNotification, object: nil)
    }
    
    func keyboardDidChangeFrame(notification: NSNotification) {
        let keyboardScreenFrameEnd = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
        let keyboardViewFrameEnd = view.convertRect(keyboardScreenEndFrame, fromView: view.window)
    
        let keyboardHeight = keyboardViewFrameEnd.height
    
        // calculate the offset of your inputView
        inputView.frame = CGRectOffset(inputView?.frame, ..., ...)
    }
    

    【讨论】:

    • 我是 swift 的初学者,请您详细解释一下
    【解决方案2】:

    找到这个问题的答案花了很长时间,但这是在启用交互状态的情况下实现此功能的正确方法。

    在具有显示聊天气泡的 tableview 或集合视图的视图控制器中覆盖 inputAccessoryView,然后返回包含 uitextView 或 uitextField 的视图。并覆盖 canBecomeFirstResponder 然后返回 true。

    override var inputAccessoryView: UIView? {
        get {
            self.inputBar.frame.size.height = self.barHeight // 50.0
            self.inputBar.clipsToBounds = true
            return self.inputBar
        }
    }
    override var canBecomeFirstResponder: Bool{
        return true
    }
    

    【讨论】:

      【解决方案3】:
      1. 设置你的滚动视图(UITableView 或 UICollectionView)框架等于你的 UIViewController 框架
      2. .interactive 设置为keyboardDismissMode 的滚动视图
      3. 覆盖canBecomeFirstResponder 并返回true
      4. 在屏幕底部使用 UITextField 或 UITextView 设置输入容器
      5. 覆盖inputAccessoryView并返回输入容器
      6. 享受

      看我的简单代码here on github

      如果您为输入视图实现自己的底部约束

      并在键盘框架通知上更改其常量。使用这几行代码,将修复动画结束时预测栏布局的错误。

      override var inputAccessoryView: UIView? {
          return UIView()
      }
      
      override var canBecomeFirstResponder: Bool {
          return true
      }
      

      【讨论】:

      • 最佳答案,对示例项目很有帮助,谢谢!
      猜你喜欢
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2018-04-30
      • 2019-06-12
      相关资源
      最近更新 更多