滚动表

时间:2016-08-29 15:09:35

标签: ios swift keyboard

我有一个视图控制器  表格视图和桌面下方的textView

当我点击textView时,键盘出现,当我在textView外面点击键盘时,键盘会失望 这工作正常,但我有一个问题,当我拖动(向下滚动)表视图时,textView不会向下移动键盘,我看到键盘后面的黑色背景,如下图所示

keyboard disappear with 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从交互式更改为 OnDrag

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

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

4 个答案:

答案 0 :(得分:1)

找到答案是永远的,但这是在启用交互状态的情况下实现此功能的正确方法。

在具有显示聊天气泡的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
}

答案 1 :(得分:0)

您可以使用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, ..., ...)
}

答案 2 :(得分:0)

  1. 设置与UIViewController框架相同的滚动视图(UITableView或UICollectionView)框架
  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
}

答案 3 :(得分:-2)

我通过将keyboardDismissMode从Interactive更改为OnDrag

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

一旦观察到表格中的任何拖动动作,这将立即将键盘和textView向下移动