iOS交互式键盘显示

iOS交互式键盘显示,ios,keyboard,Ios,Keyboard,在Facebook Messenger for iOS上,如果键盘被隐藏,如果你向上滑动,键盘就会显示出来。它的工作方式与交互式键盘模式完全相反:当您以向上滑动的速度向上滑动时,键盘会显示自己 有人对如何做到这一点有什么建议吗 编辑:谢谢你的回答!我主要是研究是否有一种内置的方式来实现这一点,因为我在Facebook Messenger中看到了这一点。然而,我刚刚读到一篇博文,他们说他们必须截图系统键盘才能获得效果,所以我假设没有内置的方法来实现这一点!正如在评论中提到的,我正在使用一个自定义键

在Facebook Messenger for iOS上,如果键盘被隐藏,如果你向上滑动,键盘就会显示出来。它的工作方式与交互式键盘模式完全相反:当您以向上滑动的速度向上滑动时,键盘会显示自己

有人对如何做到这一点有什么建议吗


编辑:谢谢你的回答!我主要是研究是否有一种内置的方式来实现这一点,因为我在Facebook Messenger中看到了这一点。然而,我刚刚读到一篇博文,他们说他们必须截图系统键盘才能获得效果,所以我假设没有内置的方法来实现这一点!正如在评论中提到的,我正在使用一个自定义键盘,所以这应该会容易得多,因为我可以控制框架

基本上,您需要UIPangestureRecognitor

  • 将UIScreenEdgePanGestureRecognizer设置为底边,将UIPanGestureRecognizer设置为隐藏脚本中的键盘,并将@iAction outlets拖动到代码中

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

  • 在拖动鼠标时的手势动作中,设置视图移动的动画

  • 停止拖动时,您需要检查视图的位置,如果视图还不在目标位置,则需要将其设置为动画

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

  • 这很简单,您只需要检查所有案例并正确测试它

    这是一个基本设置,您可以通过以下方式构建:


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

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

    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
        }
    
    }
    
    类ViewController:UIViewController{
    var collectionView:UICollectionView!
    var textView:UITextView!
    重写func viewDidLoad(){
    super.viewDidLoad()
    collectionView.panGestureRecognizer.addTarget(self,action:#选择器(handlePan(:))
    collectionView.keyboardDismissMode=.interactive
    //仅空collectionView需要
    collectionView.alwaysBounceVertical=true
    }
    func handlePan(uu发送方:UIPangestureRecognitizer){
    如果sender.state==.changed{
    let translation=sender.translation(在:视图中)
    如果translation.y<0&&collectionView.isAtBottom&&!self.textView.isFirstResponder(){
    self.textView.becomeFirstResponder()
    }
    }
    }
    }
    扩展UIScrollView{
    var isAtBottom:Bool{
    return contentOffset.y>=verticalOffsetForBottom
    }
    var verticalOffsetForBottom:CGFloat{
    让scrollViewHeight=bounds.height
    让scrollContentSizeHeight=contentSize.height
    让bottomInset=contentInset.bottom
    让scrollViewBottomOffset=scrollContentSizeHeight+bottomInset-scrollViewHeight
    返回滚动视图底部偏移量
    }
    }
    
    Hm,例如,您可以尝试设置向上/向下滑动的手势识别器,并使textfield firstResponder在滑动时从底部显示键盘或设置自定义输入视图的动画。你已经试过实现它了吗?我正在尝试从底部显示键盘动画。没有人尝试实现它——我不确定如何控制键盘的位置。它是一个自定义键盘或本机iOS kb?它实际上是一个自定义键盘,这可能会有所帮助!
    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
        }
    
    }