IOS项目是使用混合模式开发,在开发聊天功能时;发现软键盘不能像QQ、微信那样,换行键不能变为发送;网上说是因为输入框类别导致;尝试过以后,还是不行;然后想到用IOS native解决;

先说一下,原生APP 设置软键盘换行键为发送键:

textField.returnKeyType = UIReturnKeySend;//变为发送按钮

这里说一下流程,代码最后贴;

1.注册监听软键盘弹起事件

a).获取软键盘视图

b).获取换行键视图,IOS中换行键叫做Return-Key

c).创建UiButton,将button添加到换行键视图中,创建button时 frame设定位 x=0,y=0,width=换行键width,height=换行键height

d).允许换行键与用户交互:setUserInteractionEnabled: YES

e).注册button TouchDown和TouchUpInside事件

f).添加button事件响应函数

g).添加软键盘tap事件代理

2.注册监听软键盘输入法切换事件

a).创建Timer定时器,不用循环;创建前先判断一下定时器是否活动,如果处于活动中,先销毁再创建,延时在100ms

b).重复1中的步骤

c).销毁定时器并置为nil

3.软键盘tap代理:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

这里说一下为什么要做软键盘tap代理,因为软键盘当中很多功能键都会切换整个键盘视图,所以要重新添加;而且不能直接给这些功能键不能直接设置tap事件,因为这些按键视图本身是不允许与用户交互的;如果你设置了,则按键不能正常输入

a).获取软键盘视图

b).判断tap的touch的点是否在软键盘的功能键当中

c).如果是,则重复2当中步骤

最后,将第一部分代码抽离出来成为一个函数,2、3中直接调用即可。

代码部分:

1.在viewDidLoad中注册通知:

// 键盘出现的通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];// 键盘消失的通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHiden:) name:UIKeyboardWillHideNotification object:nil];//输入法切换[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputModeDidChange:) name:UITextInputCurrentInputModeDidChangeNotification object:nil];

2.注册通知的响应函数:

- (void)keyboardWasShown:(NSNotification *)notification
{NSLog(@"弹起");[self createSendBtnInKeyBoardTimer:timer];
}
- (void)keyboardWillBeHiden:(NSNotification *)notification
{NSLog(@"收起");
//    self.textFiledScrollView.frame = CGRectMake(0, 64, kViewWidth, 455.5);
}- (void) inputModeDidChange:(NSNotification*) notification {NSLog(@"inputModeDidChange");timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(createSendBtnInKeyBoardTimer:) userInfo:nil repeats:NO];
}

3.添加发送按钮到换行键视图中实现:

- (void)createSendBtnInKeyBoardTimer:(NSTimer*)timer {NSLog(@"create sendBtn");if(nil != button){[button removeFromSuperview];button = nil;}//判断当前页面是否为聊天界面UIWebView *webview = (UIWebView *)self.webView;NSString *hidden = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById('communicationTab') == null "];NSLog(@"hidden: %@", hidden);if(![hidden isEqualToString: @"false"]){return;}UIView *keyboard = [self findKeyboard];NSArray *arr = [keyboard subviews];//    UIView * impl = arr[0];//    NSArray *arr2 = [[[impl subviews][0] subviews][1] subviews];UIView *returnView = [self findKey: arr byType: @"Return-Key"];if(nil != returnView){CGRect rect = [returnView frame];button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, rect.size.width, rect.size.height)];[[button layer] setCornerRadius: 4];[button setBackgroundColor:[UIColor colorWithRed:20/255.0 green:106/255.0 blue:255/255.0 alpha:1]];[button setTitle:@"发送"forState:UIControlStateNormal];[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];[returnView addSubview:button];//允许return按钮事件触发[returnView setUserInteractionEnabled:YES];//允许与用户交互 [button addTarget:selfaction:@selector(sendBtnDown:)forControlEvents:UIControlEventTouchDown];[button addTarget:selfaction:@selector(sendBtnTouchUp:)forControlEvents:UIControlEventTouchUpInside];UITapGestureRecognizer *tapGesturRecognizer=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(imageViewTapped:)];//添加软键盘tap事件tapGesturRecognizer.delegate = self;//这里不会响应 因为在代理函数中已经阻止事件传递[keyboard addGestureRecognizer: tapGesturRecognizer];//不能给按键直接添加事件 因为被键盘视图拦截了
//        UIView* shiftView = [self findKey: arr byType: @"Shift-Key"];
//        if(nil != shiftView){
//            [shiftView addGestureRecognizer: tapGesturRecognizer];
//        }}if(timer){[timer invalidate];timer = nil;}
}

4.软键盘tap事件代理函数实现:

/**keyboardView tap事件代理方法只需获取touch位置 去键盘中判断 如果位置在指定的几个按键中,就去执行一定的方法最后返回NO 阻止事件继续,否则键盘不能输入*/
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {NSLog(@"ges:UITouch");UIWebView *webview = (UIWebView *)self.webView;NSString *hidden = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById('communicationTab') == null "];NSLog(@"hidden: %@", hidden);if(![hidden isEqualToString: @"false"]){return NO;}UIView *keyboard = [self findKeyboard];NSArray *arr = [keyboard subviews];BOOL isTouchedInView = false;//添加功能键名称 这个可以自己打印看一下NSArray * keyTypes = @[@"Shift-Key",@"More-Key",@"TenKey-Chinese-Wubihua-Alphabet-Keyplane-Switch-Key",@"TenKey-Chinese-Facemark",@"TenKey-Wubihua-Keyplane-Switch-Key",@"TenKey-Number-To-Number-Alternative-Keyplane-Switch-Key",@"TenKey-Pinyin-Keyplane-Switch-Key",@"TenKey-Chinese-Number-Keyplane-Switch-Key"];//touchedInKeyboardViewByArrayKey 判断touch的点是否在这些功能按键范围内isTouchedInView = [self touchedInKeyboardViewByArrayKey:arr byTypes:keyTypes byTouch:touch];if(isTouchedInView){NSLog(@"触摸点在视图内");if(timer){[timer invalidate];timer = nil;}timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(createSendBtnInKeyBoardTimer:) userInfo:nil repeats:NO];return NO;}return NO;
}
//不会执行到这里来 但是最好还是写上
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press {NSLog(@"ges:UIPress");return NO;
}

最后来几个截图:

IOS 自定义软键盘功能,修改换行键为发送键相关推荐

  1. Android 自定义软键盘实现 数字九宫格

    前言 最近项目在对接美团外卖功能 实现外面小哥凭取货码取货 对接完功能后 用户反馈 弹出的软键盘 很难输入 数字太小了 大概是下面这种显示方式 需求 组长说 要不搞一个自定义软键盘吧 数字搞大点 方便 ...

  2. ios微信软键盘之殇

    先说一下业务场景. 界面有弹窗,在弹窗内输入时,弹出软键盘输入短信验证码.验证成功后隐藏弹窗,弹出有复制按钮的弹窗.点击复制按钮,复制相关内容. 在开发这个功能的时候,有两个渠道,一个是支付宝h5,一 ...

  3. android keyboard颜色,Android基于KeyboardView和Keyboard实现自定义软键盘 自定义键盘背景色...

    Android基于KeyboardView和Keyboard实现自定义软键盘 在一些特别的情况下我们需要去自定义键盘 例如: 银行app的密码输入之类的 笨方法就是直接使用布局写我们的自定义软键盘 但 ...

  4. Android基于KeyboardView和Keyboard实现自定义软键盘 自定义键盘背景色

    Android基于KeyboardView和Keyboard实现自定义软键盘 在一些特别的情况下我们需要去自定义键盘 例如: 银行app的密码输入之类的 笨方法就是直接使用布局写我们的自定义软键盘 但 ...

  5. Android自定义软键盘输入法,隐藏系统输入法显示光标的实现

    android实现自定义软键盘,先上图看效果,效果基本上是仿ios输入法实现的 这里是实现隐藏系统输入法,同时让EditText能获取光标的代码部分(通过反射调用): <span style=& ...

  6. ios获取软键盘完成事件

    ios获取软键盘完成事件,通过判断input的onBlur事件即可

  7. android点击隐藏控件,Android编程实现点击EditText之外的控件隐藏软键盘功能

    本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能.分享给大家供大家参考,具体如下: 工具类 ... public static void hideKeyboard(Co ...

  8. Android使用xml自定义软键盘效果(附源码)

    Android使用xml自定义软键盘效果原理: 1,软键盘其实是个控件,使用android.inputmethodserver.KeyboardView类定义. 2,主布局中使用帧布局,当我们需要显示 ...

  9. android自定义系统键盘,Android自定义软键盘

    [实例简介] Android自定义软键盘 [实例截图] [核心代码] keydemo └── keydemo ├── AndroidManifest.xml ├── bin │   ├── class ...

最新文章

  1. 创建Swap交换空间
  2. XP+UBUNTU双系统上重装XP后修复GRUB方法
  3. 预测数值型数据:回归源码分析(1)
  4. ERC223以太坊通证标准
  5. 日本新年传统习俗介绍(二)
  6. python post请求参数化,参数化包含JSON主体的python POST请求
  7. Don't Panic! KRACK 没你想象的那么糟
  8. Fresco几处不太好的地方
  9. LNMP环境下搭建wordpress
  10. vue 生成二维码(中间logo),下载二维码,复制链接(vue + vue-qr+clipboard)
  11. PASCAL VOC 2012 and SBD (the augment dataset) 总结
  12. Kylin使用Spark构建Cube
  13. Breeze魔兽编程交流论坛
  14. 任务调度+资源调度整合(学习笔记)
  15. HTML页面SVG的使用
  16. java小游戏------Flappy Bird(飞翔的小鸟含源码)
  17. java+ jsp+js 实现富文本编辑和上传图片功能
  18. 基础SQL Server 操作问题——仅当使用了列表并且IDENTITY_INSERT为ON时,才能为表中的标识列制定显示值
  19. matlab 色温图,技术:图文教你了解色温及如何选择色温
  20. CVE2017-8464:震网三代漏洞分析

热门文章

  1. 如何设计一个监控平台(上篇)
  2. 计算机向u盘拷贝速度慢,U盘读写拷贝速度慢的解决措施
  3. OFDM载波间隔_LTE-子载波间隔与符号持续时长关系
  4. 游戏数值策划入门介绍
  5. 系统性简述蓝牙以及ESP32对BLE蓝牙的使用(一)
  6. 2033-人见人爱A+B(java)
  7. 基于Spring Boot框架的驾校学员信息管理系统
  8. 3.MySQL数据库的索引
  9. C语言全局变量那些事儿
  10. Python3爬取企查查网站的企业年表并存入MySQL