iOS互动键盘显示

时间:2017-04-07 08:19:12

标签: ios keyboard

在Facebook Messenger for iOS上,它有它,所以如果键盘被隐藏,如果你向上滑动,键盘将显示。它与交互式键盘解雇模式完全相反:键盘以您向上滑动的速度向上滑动时显示自己。

有人对如何做到这一点有任何指示吗?

编辑:谢谢你的答案!因为我看到它是在Facebook Messenger中完成的,所以我主要考虑是否有内置的方法来做到这一点。但是,我刚读了一篇博文,他们说他们必须截取系统键盘以获得效果 - 所以我假设没有内置的方法来做到这一点!正如评论中所提到的,我正在使用自定义键盘,所以这应该更容易,因为我可以控制框架!

2 个答案:

答案 0 :(得分:4)

基本上你需要UIPanGestureRecognizer。

  1. 为底边设置UIScreenEdgePanGestureRecognizer,UIPanGestureRecognizer用于在Storyboard中隐藏键盘并将@IBAction出口拖到代码中。

  2. 使用键盘在Storyboard的控制器底部设置键盘视图容器,以便用户看不到它。将@IBOutlet拖到您的代码中,这样您就可以修改它的框架。

  3. 在拖动动画视图移动时的手势动作中。

  4. 当停止拖动时,您需要检查视图的位置并将其设置为目标,如果它还没有。

  5. 此外,您还需要为拖动区域添加一项检查,以便用户无法进一步拖动它。

  6. 这很简单,您只需要检查所有案例并进行正确测试。

    这是您可以使用此构建的基本设置:

    class ViewController: UIViewController {
    
        @IBOutlet weak var keyboardContainerView: UIView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func onEdgePanGestureDrag(_ sender: UIScreenEdgePanGestureRecognizer) {
            let point = sender.location(in: view)
    
            view.layoutIfNeeded()
            UIView.animate(withDuration: 0.33) {
                // Animate your custom keyboard view's position
                self.keyboardContainerView.frame = CGRect(x: self.keyboardContainerView.bounds.origin.x,
                                                          y: point.y,
                                                          width: self.keyboardContainerView.bounds.width,
                                                          height: self.keyboardContainerView.bounds.height)
            }
            view.layoutIfNeeded()
        }
    
        @IBAction func onPanGestureDrag(_ sender: UIPanGestureRecognizer) {
            let point = sender.location(in: view)
    
            view.layoutIfNeeded()
            UIView.animate(withDuration: 0.33) {
                // Animate your custom keyboard view's position
                self.keyboardContainerView.frame = CGRect(x: self.keyboardContainerView.bounds.origin.x,
                                                          y: point.y,
                                                          width: self.keyboardContainerView.bounds.width,
                                                          height: self.keyboardContainerView.bounds.height)
            }
            view.layoutIfNeeded()
        }
    }
    

答案 1 :(得分:1)

这是对我有用的实现。它不是完美的,但是效果很好并且易于实现。您将需要一个集合视图或一个表视图。

为简单起见,我将仅显示此功能所需的代码。因此,请处理视图初始化所需的所有其他内容。

class ViewController: UIViewController {
    var collectionView: UICollectionView!
    var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.panGestureRecognizer.addTarget(self, action: #selector(handlePan(_:)))
        collectionView.keyboardDismissMode = .interactive
        // Only necessary for empty collectionView
        collectionView.alwaysBounceVertical = true
    }

    func handlePan(_ sender: UIPanGestureRecognizer) {
        if sender.state == .changed {
            let translation = sender.translation(in: view)

            if translation.y < 0 && collectionView.isAtBottom && !self.textView.isFirstResponder() {
                self.textView.becomeFirstResponder()
            }
        }
    }
}

extension UIScrollView {

    var isAtBottom: Bool {
        return contentOffset.y >= verticalOffsetForBottom
    }

    var verticalOffsetForBottom: CGFloat {
        let scrollViewHeight = bounds.height
        let scrollContentSizeHeight = contentSize.height
        let bottomInset = contentInset.bottom
        let scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight
        return scrollViewBottomOffset
    }

}