前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >react native 无侵入 彻底解决键盘遮挡问题

react native 无侵入 彻底解决键盘遮挡问题

作者头像
onety码生
发布2018-11-21 11:48:33
3.4K0
发布2018-11-21 11:48:33
举报
文章被收录于专栏:码生码生

无论原生还是h5以及ReactNative 中对于键盘的遮挡问题一直是个难题

而即便对于一些出名的第三方库,在对于自定义inputView和RN中都有异常情况

RN中键盘遮挡问题也是个热门,google一下就会发现都在查找解决方法

例如:

  • 放在 scrollView 如何自动顶上去,还要考虑偏移量问题
  • RN中监控键盘的位置变化
  • 自定义一个 scrollView,所有需要防遮挡的,都必须使用这个自定义 scrollView
  • 自定义一个 InputText,所有需要防遮挡的,都必须使用这个自定义 InputText
  • 还有ReactNative官方的 AvoidKeyboardView ,这个其实很不稳定。为什么?因为它真的不稳定

其实在我看来也是个很简单的问题,因为大部分人都进入误区中,无法看透本质

    1. 防键盘为什么必须在RN中解决呢
    1. 自定义防遮挡的 InputText scrollView 写起来很麻烦,用起来也麻烦,为什么还要写呢?
    1. 为什么不能从原生解决呢?
    1. 因为原生的键盘防遮挡库都没办法单独的控制每一个 InputText
    1. 即便原生的库非常强大,但是RN中怎么使用呢?
    1. 怎么才能做到 RN 中,无代码侵入,无项目侵入?

解决办法

首先说明一下:安卓是不需要考虑这个问题的,因为原生自带防遮挡效果

1. 引入原生库

引入原生库,在原生控制,才能做到

  • 稳定(原生对键盘和 UITextField 的监控和控制不是比RN更稳定吗)
  • RN无丝毫代码侵入、项目侵入
  • 可以单独控制每一个输入框

请参考我的另外一篇文章

iOS键盘防键盘遮挡库 KKInputAvoidKeyBoard 每个 UITextField 都可以自己控制

2. 原理说明

首先说明:

FaceBook 推出了 ReactNative 的技术,把前端开发引入了另一个方向,支持跨平台开发

技术只是技术,代码只是代码,人是活的

没有看源码的程序员不是好程序员,没有修改过源码的程序员更不是好程序员(在有需求或者源码出问题或不完善的情况下)

看过 KKInputAvoidKeyBoard 的应该都知道,可以对每一个输入框做键盘防遮挡,并且用法超级简单,最重要的是,已经上线。并且我们公司做各种信息录入,有大量的输入框,自定义键盘,自定义 inputView 等,均已测试无问题。

isAvoidKeyBoardEnable 来控制是否防遮挡

avoidKeyBoardDistance 来控制输入框底部到键盘的距离

so easy

3. 现在来说如何兼容 ReactNative

修改 RN 源码

另外多说一句,建议所有项目都 pod 引入 ReactNative

  • React.podspec 依赖 KKInputAvoidKeyBoard
代码语言:javascript
复制
  s.subspec "RCTText" do |ss|
    ss.dependency  "KKInputAvoidKeyBoard"
    ss.dependency             "React/Core"
    ss.source_files         = "Libraries/Text/*.{h,m}"
  end

8925C181121053238C9327038B67F376.jpg

*

8829859A835B595CF14A6ED91139B88E.jpg

  • 当然不用我说也知道

在两个 OC 文件中

代码语言:javascript
复制
#import <KKInputAvoidKeyBoard/KKInputAvoidKeyBoard-Swift.h>

4. 简单解决问题,早点下班

如此便给 RN 中所有的 InputText 增加了以下两个属性和功能

RN中无代码侵入,项目无侵入

/* 键盘遮挡后,是否自动调整,防止键盘遮挡 */ isAvoidKeyBoardEnable={true}

/* 键盘顶起后,底部距离键盘的距离 */ avoidKeyBoardDistance={20}

代码语言:javascript
复制
<InputText isAvoidKeyBoardEnable={true} avoidKeyBoardDistance={100}/>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决办法
    • 1. 引入原生库
      • 2. 原理说明
        • 3. 现在来说如何兼容 ReactNative
          • 4. 简单解决问题,早点下班
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档