美文网首页
iOS 解决UIScrollView点击空白区域键盘收回问题

iOS 解决UIScrollView点击空白区域键盘收回问题

作者: Smalla | 来源:发表于2020-01-20 16:48 被阅读0次
    场景:

    页面用UIScrollView布局,ScrollView上添加各种控件,其中有UITextField输入框,输入内容完毕之后,期望是点击ScrollView上的空白区域,键盘能收回。

    方案:

    1、ScrollView添加UIControl,UIControl的大小跟ScrollView一致,在UIControl绑定touchUpInside方法,即

    // 开发语言为Swift5.0语法。布局,这里用的SnapKit。
    // 注意:布局不要用 make.left.right.top.bottom.equalTo(bgScrollView),会导致UIControl不能正常加载。
    control.snp.makeConstraints({ (make) in
         make.top.equalTo(bgScrollView)
         make.width.equalTo(ScreenWidth)
         make.centerX.equalTo(bgScrollView)
         make.height.equalTo(view.height)
    })
    
    // 绑定
    control.addTarget(self, action: #selector(resignKeyBoard), for: .touchUpInside)
    
    // Action   其中,MainWindow = UIApplication.shared.windows.first
     @objc func resignKeyBoard() {
        MainWindow?.endEditing(true)
     }
    

    结论:这种方案确实可以解决点击空白区域,让键盘收起问题。但新的问题来了,当屏幕内容视图超过一屏时,我们修改完bgScrollView的contentSize之后,必须要同时更新control的height,不然点击超过一屏的空白区域,不会执行resignKeyBoard()方法,相对比较麻烦。

    2、ScrollView添加UITapGestureRecognizer手势,即:

    // cancelsTouchesInView属性是为了防止手势点击事件与ScrollView上其他控件的点击事件出现冲突。
    // 比如说UITableView(继承于UIScrollView)上的didSelectRowAt事件。
    _ = UITapGestureRecognizer(target: self, action: #selector(resignKeyBoard)).then({ (g) in
          bgScrollView.addGestureRecognizer(g)
          g.cancelsTouchesInView = false
     })
    
    // Action   其中,MainWindow = UIApplication.shared.windows.first
     @objc func resignKeyBoard() {
        MainWindow?.endEditing(true)
     }
    

    结论:该方案相对比较简洁,建议采纳。不过目前也发现了新问题,如果是输入状态下,点击输入框右边的清除按钮x,无法清除输入框内容,而是收起键盘,也就是添加的点击手势覆盖了清除事件。

    Tips:如果对交互体验要求比较高,建议采取方案1,虽然代码量多点,但基本上不会影响ScrollView上其他控件的交互。如果对体验要求不是特别高,可以采取方案2,毕竟有效减少代码量。

    相关文章

      网友评论

          本文标题:iOS 解决UIScrollView点击空白区域键盘收回问题

          本文链接:https://www.haomeiwen.com/subject/tbvjzctx.html