IOS 自定义软键盘功能,修改换行键为发送键
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 自定义软键盘功能,修改换行键为发送键相关推荐
- Android 自定义软键盘实现 数字九宫格
前言 最近项目在对接美团外卖功能 实现外面小哥凭取货码取货 对接完功能后 用户反馈 弹出的软键盘 很难输入 数字太小了 大概是下面这种显示方式 需求 组长说 要不搞一个自定义软键盘吧 数字搞大点 方便 ...
- ios微信软键盘之殇
先说一下业务场景. 界面有弹窗,在弹窗内输入时,弹出软键盘输入短信验证码.验证成功后隐藏弹窗,弹出有复制按钮的弹窗.点击复制按钮,复制相关内容. 在开发这个功能的时候,有两个渠道,一个是支付宝h5,一 ...
- android keyboard颜色,Android基于KeyboardView和Keyboard实现自定义软键盘 自定义键盘背景色...
Android基于KeyboardView和Keyboard实现自定义软键盘 在一些特别的情况下我们需要去自定义键盘 例如: 银行app的密码输入之类的 笨方法就是直接使用布局写我们的自定义软键盘 但 ...
- Android基于KeyboardView和Keyboard实现自定义软键盘 自定义键盘背景色
Android基于KeyboardView和Keyboard实现自定义软键盘 在一些特别的情况下我们需要去自定义键盘 例如: 银行app的密码输入之类的 笨方法就是直接使用布局写我们的自定义软键盘 但 ...
- Android自定义软键盘输入法,隐藏系统输入法显示光标的实现
android实现自定义软键盘,先上图看效果,效果基本上是仿ios输入法实现的 这里是实现隐藏系统输入法,同时让EditText能获取光标的代码部分(通过反射调用): <span style=& ...
- ios获取软键盘完成事件
ios获取软键盘完成事件,通过判断input的onBlur事件即可
- android点击隐藏控件,Android编程实现点击EditText之外的控件隐藏软键盘功能
本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能.分享给大家供大家参考,具体如下: 工具类 ... public static void hideKeyboard(Co ...
- Android使用xml自定义软键盘效果(附源码)
Android使用xml自定义软键盘效果原理: 1,软键盘其实是个控件,使用android.inputmethodserver.KeyboardView类定义. 2,主布局中使用帧布局,当我们需要显示 ...
- android自定义系统键盘,Android自定义软键盘
[实例简介] Android自定义软键盘 [实例截图] [核心代码] keydemo └── keydemo ├── AndroidManifest.xml ├── bin │ ├── class ...
最新文章
- 创建Swap交换空间
- XP+UBUNTU双系统上重装XP后修复GRUB方法
- 预测数值型数据:回归源码分析(1)
- ERC223以太坊通证标准
- 日本新年传统习俗介绍(二)
- python post请求参数化,参数化包含JSON主体的python POST请求
- Don't Panic! KRACK 没你想象的那么糟
- Fresco几处不太好的地方
- LNMP环境下搭建wordpress
- vue 生成二维码(中间logo),下载二维码,复制链接(vue + vue-qr+clipboard)
- PASCAL VOC 2012 and SBD (the augment dataset) 总结
- Kylin使用Spark构建Cube
- Breeze魔兽编程交流论坛
- 任务调度+资源调度整合(学习笔记)
- HTML页面SVG的使用
- java小游戏------Flappy Bird(飞翔的小鸟含源码)
- java+ jsp+js 实现富文本编辑和上传图片功能
- 基础SQL Server 操作问题——仅当使用了列表并且IDENTITY_INSERT为ON时,才能为表中的标识列制定显示值
- matlab 色温图,技术:图文教你了解色温及如何选择色温
- CVE2017-8464:震网三代漏洞分析