iOS开发中,经常会用到UITextView,UITextField输入文本操作,默认的键盘输入会有emoji表情、空格、非法字符等,会与实际的产品需求不符,这时候就需要我们做限制,禁止输入表情或者空格,甚至标点符号,限制输入的字符个数,小数点之后保留几位,键盘防遮挡(监控键盘高度)等等不同的需求。针对这些需求,博主整理了一下,主要有以下三个方面。

1.屏蔽emoji表情,屏蔽空格

首先说的是屏蔽emoji表情,屏蔽空格,这里主要针对第三方键盘(例如搜狗输入法)和系统键盘的处理。(UITextFieldDelegate和NSNotificationCenter要同时使用)

1)iOS系统键盘使用UITextField的代理即可监控。

#pragma mark - UITextField代理
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{UITextInputMode *inputMode = [UITextInputMode currentInputMode];//会有警告(7.0),可参考替换 UITextInputMode *inputMode = textField.textInputModeNSString *indentifier = [inputMode performSelector:NSSelectorFromString(@"identifier")];//会有警告(leak),可被忽略。if ([indentifier isEqualToString:@"com.sogou.sogouinput.basekeyboard"]) {//搜狗键盘//过滤emoji表情BOOL isEmoj = [self stringContainsEmoji:string];if (isEmoj) {string = [self disable_emoji:string];}else{//非emoji}//过滤空格NSString *lTmp = [NSString stringWithFormat:@"%s"," "];string = [string stringByReplacingOccurrencesOfString:lTmp withString:@""];}else{if ([indentifier isEqualToString:@"zh_Hans-Pinyin@sw=Pinyin10-Simplified;hw=US"]) {//简体拼音(九宫格)//过滤emoji表情BOOL isEmoj = [self stringContainsEmoji:string];if (isEmoj) {string = [self disable_emoji:string];}else{//非emoji}//过滤空格if ([string isEqualToString:@" "]) {return NO;}}if ([indentifier isEqualToString:@"zh_Hans-Pinyin@sw=Pinyin-Simplified;hw=US"]) {//简体拼音(全键盘)//过滤emoji表情BOOL isEmoj = [self stringContainsEmoji:string];if (isEmoj) {string = [self disable_emoji:string];}else{//非emoji}//过滤空格if ([string isEqualToString:@" "]) {return NO;}}if ([indentifier isEqualToString:@"emoji@sw=Emoji"]) {//表情符号return NO;}if ([indentifier isEqualToString:@"en_US@hw=US;sw=QWERTY"]) {//English(US)}  //其他键盘同理可自行判断(三方自定义键盘样式、输入模式不确定)}return YES;}

2)针对搜狗输入法,联想文字不受控制,UITextField的代理方法就会监控失效,那么此时我们就不能使用代理了。

#pragma mark - 添加监控
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:)name:@"UITextFieldTextDidChangeNotification"object:textField];//按照自己的需求添加监控对象。
#pragma mark - 监控处理
-(void)textFiledEditChanged:(NSNotification*)obj{//textFiledUITextField *textField = (UITextField *)obj.object;NSString *toBeString = textField.text;UITextInputMode *inputMode = [UITextInputMode currentInputMode];//键盘类型NSString *indentifier = [inputMode performSelector:NSSelectorFromString(@"identifier")];if ([indentifier isEqualToString:@"com.sogou.sogouinput.basekeyboard"]) {//搜狗键盘//过滤emoji表情BOOL isEmoj = [self stringContainsEmoji:toBeString];if (isEmoj) {toBeString = [self disable_emoji:toBeString];}else{//非emoji}//过滤空格NSString *lTmp = [NSString stringWithFormat:@"%s"," "];toBeString = [toBeString stringByReplacingOccurrencesOfString:lTmp withString:@""];textField.text = toBeString;}else{if ([indentifier isEqualToString:@"zh_Hans-Pinyin@sw=Pinyin10-Simplified;hw=US"]) {//简体拼音(九宫格)}if ([indentifier isEqualToString:@"zh_Hans-Pinyin@sw=Pinyin-Simplified;hw=US"]) {//简体拼音(全键盘)}if ([indentifier isEqualToString:@"emoji@sw=Emoji"]) {//表情符号//过滤emoji表情BOOL isEmoj = [self stringContainsEmoji:toBeString];if (isEmoj) {toBeString = [self disable_emoji:toBeString];}else{//非emoji}//过滤空格NSString *lTmp = [NSString stringWithFormat:@"%s"," "];toBeString = [toBeString stringByReplacingOccurrencesOfString:lTmp withString:@""];textField.text = toBeString;}if ([indentifier isEqualToString:@"en_US@hw=US;sw=QWERTY"]) {//English(US)//过滤emoji表情BOOL isEmoj = [self stringContainsEmoji:toBeString];if (isEmoj) {toBeString = [self disable_emoji:toBeString];}else{//非emoji}//过滤空格NSString *lTmp = [NSString stringWithFormat:@"%s"," "];toBeString = [toBeString stringByReplacingOccurrencesOfString:lTmp withString:@""];textField.text = toBeString;}}//其他键盘同理可自行判断(三方自定义键盘样式、输入模式不确定)
}

补充说明一下如何屏蔽标点符号

#pragma mark - 屏蔽标点符号(这个算是额外补充,可视情况添加在需要的地方)NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\""];toBeString = [toBeString stringByTrimmingCharactersInSet:set];//toBeString为你想要处理的字符串

3) 判断字符串中年是否含有emoji

#pragma mark - 判断NSString字符串是否包含emoji表情- (BOOL)stringContainsEmoji:(NSString *)string
{__block BOOL returnValue = NO;[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {const unichar hs = [substring characterAtIndex:0];// surrogate pairif (0xd800) {if (0xd800 <= hs && hs <= 0xdbff) {if (substring.length > 1) {const unichar ls = [substring characterAtIndex:1];const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;if (0x1d000 <= uc && uc <= 0x1f77f) {returnValue =YES;}}}else if (substring.length > 1) {const unichar ls = [substring characterAtIndex:1];if (ls == 0x20e3) {returnValue =YES;}}else {// non surrogateif (0x2100 <= hs && hs <= 0x27ff) {returnValue =YES;}else if (0x2B05 <= hs && hs <= 0x2b07) {returnValue =YES;}else if (0x2934 <= hs && hs <= 0x2935) {returnValue =YES;}else if (0x3297 <= hs && hs <= 0x3299) {returnValue =YES;}else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {returnValue =YES;}}}}];return returnValue;
}

4) 过滤表情

#pragma mark - 过滤表情
- (NSString *)disable_emoji:(NSString *)text
{NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]" options:NSRegularExpressionCaseInsensitive error:nil];NSString *modifiedString = [regex stringByReplacingMatchesInString:textoptions:0range:NSMakeRange(0, [text length])withTemplate:@""];return modifiedString;
}

2.限制键盘输入的字符个数(小数点后保留n位)

#pragma mark - 宏定义#define myDotNumbers     @"0123456789.\n"
#define myNumbers          @"0123456789\n"
#pragma mark - UITextField代理- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{if ([string isEqualToString:@"\n"]||[string isEqualToString:@""]) {//按下returnreturn YES;}NSCharacterSet *cs;NSUInteger nDotLoc = [textField.text rangeOfString:@"."].location;if (NSNotFound == nDotLoc && 0 != range.location) {cs = [[NSCharacterSet characterSetWithCharactersInString:myNumbers]invertedSet];if ([string isEqualToString:@"."]) {return YES;}if (textField.text.length>=20) {  //小数点前面20位return NO;}}else {cs = [[NSCharacterSet characterSetWithCharactersInString:myDotNumbers]invertedSet];if (textField.text.length>=23) {//整个最长23位return  NO;}}NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];BOOL basicTest = [string isEqualToString:filtered];if (!basicTest) {return NO;}if (NSNotFound != nDotLoc && range.location > nDotLoc +2) {//小数点后面两位return NO;}return YES;
}
//具体是如何计算的呢?小数点一位,小数点之后两位,小数点之前最长20,整个最长1+2+20=23.

3.监控键盘高度

第三方:IQKeyboard同样的原理,可以参考一下。获取高度,位移单个控件或者view。

[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(keyboardWillShow:)name:UIKeyboardWillShowNotificationobject:nil];

例如iPhone6以上的只使用上面的就可以,但是像iPhone5、iPhone5s这样的需要额外监控。以下是补充说明。

//-----------2016年10月25日更新---------------
#ifdef __IPHONE_5_0float version = [[[UIDevice currentDevice] systemVersion] floatValue];if (version >= 5.0) {[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow1:) name:UIKeyboardWillChangeFrameNotification object:nil];}
#endif
- (void)keyboardWillShow:(NSNotification *)notification
{CGRect keyboardRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];CGFloat keyboardHeight = keyboardRect.size.height;
}

IQKeyboard的keyboardWillShow:方法。

#pragma mark - UIKeyboad Notification methods
/*  UIKeyboardWillShowNotification. */
-(void)keyboardWillShow:(NSNotification*)aNotification
{_kbShowNotification = aNotification;if ([self privateIsEnabled] == NO)  return;_IQShowLog([NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]);//Due to orientation callback we need to resave it's original frame.    //  (Bug ID: #46)//Added _isTextFieldViewFrameChanged check. Saving textFieldView current frame to use it with canAdjustTextView if textViewFrame has already not been changed. (Bug ID: #92)if (_isTextFieldViewFrameChanged == NO && _textFieldView){_textFieldViewIntialFrame = _textFieldView.frame;_IQShowLog([NSString stringWithFormat:@"Saving %@ Initial frame :%@",[_textFieldView _IQDescription],NSStringFromCGRect(_textFieldViewIntialFrame)]);}if (CGRectEqualToRect(_topViewBeginRect, CGRectZero))    //  (Bug ID: #5){//  keyboard is not showing(At the beginning only). We should save rootViewRect._rootViewController = [_textFieldView topMostController];if (_rootViewController == nil)  _rootViewController = [[self keyWindow] topMostController];_topViewBeginRect = _rootViewController.view.frame;_IQShowLog([NSString stringWithFormat:@"Saving %@ beginning Frame: %@",[_rootViewController _IQDescription] ,NSStringFromCGRect(_topViewBeginRect)]);}if (_shouldAdoptDefaultKeyboardAnimation){//  Getting keyboard animation._animationCurve = [[aNotification userInfo][UIKeyboardAnimationCurveUserInfoKey] integerValue];_animationCurve = _animationCurve<<16;}else{_animationCurve = UIViewAnimationOptionCurveEaseOut;}//  Getting keyboard animation durationCGFloat duration = [[aNotification userInfo][UIKeyboardAnimationDurationUserInfoKey] floatValue];//Saving animation durationif (duration != 0.0)    _animationDuration = duration;CGSize oldKBSize = _kbSize;//  Getting UIKeyboardSize.CGRect kbFrame = [[aNotification userInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue];CGRect screenSize = [[UIScreen mainScreen] bounds];//Calculating actual keyboard displayed size, keyboard frame may be different when hardware keyboard is attached (Bug ID: #469) (Bug ID: #381)CGRect intersectRect = CGRectIntersection(kbFrame, screenSize);if (CGRectIsNull(intersectRect)){_kbSize = CGSizeMake(screenSize.size.width, 0);}else{_kbSize = intersectRect.size;}//If last restored keyboard size is different(any orientation accure), then refresh. otherwise not.if (!CGSizeEqualToSize(_kbSize, oldKBSize)){//If _textFieldView is inside UIAlertView then do nothing. (Bug ID: #37, #74, #76)//See notes:- https://developer.apple.com/Library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html. If it is UIAlertView textField then do not affect anything (Bug ID: #70).if (_textFieldView != nil  && [_textFieldView isAlertViewTextField] == NO){[self adjustFrame];}}_IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]);
}

iOS - 监控键盘高度、屏蔽字符、限制字符个数相关推荐

  1. iOS第三方键盘高度获取方法

    ios8允许第三方键盘使用后,键盘的高度经常不准确,怎么破,不废话,上代码. #import "ViewController.h"@interface ViewController ...

  2. c语言学习-从键盘上输入100个字符,统计其中字母、每个数字和其它字符的个数及其百分比

    从键盘上输入100个字符,统计其中字母.每个数字和其它字符的个数及其百分比 程序流程图: 代码: #include<stdio.h> void main() {char ch[100]; ...

  3. iOS键盘监听以及获取键盘高度

    在文本输入时,界面会弹出键盘.有时,当文本输入框过低,被键盘遮挡,使用户无法看见输入框文本内容,这就使得用户体验过低. 所以需要我们对键盘进行监控并获取键盘高度,调节界面或文本框高度进行处理.如下图, ...

  4. python判断特殊字符的函数,python学习--quote()函数,,屏蔽特殊的字符、比如

    python学习--quote()函数,,屏蔽特殊的字符.比如 屏蔽特殊的字符.比如如果url里面的空格!url里面是不允许出现空格的. 在 Python2.x 中的用法是: urllib.quote ...

  5. 汇编语言: 从键盘上输入一串字符(用回车键结束,使用 10 号功能调用。)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字。如有,则把 CL 的第 5 位置 1,否则将该位置置 0。

    从键盘上输入一串字符(用回车键结束,使用 10 号功能调用.)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字.如有,则把 CL 的第 5 位置 1,否则将该位置置 0. data s ...

  6. JAVA实现在键盘上输入一串字符,判断输入各类型字符的数量

    内容:在键盘上随意输入一段字符,字符可能会是数字,英文大小写字母,标点,空格等等不同类型,然后写一段程序实现对不同类型字符数量的计数. 平台:JAVA eclipse 首先,先定义一下几个变量的数据类 ...

  7. 『IOS』iPhone和ipad键盘高度及键盘响应事件

    原文地址:http://blog.csdn.net/benbenxiongyuan/article/details/7892019 IPAD键盘高度: portrait  264 landscape ...

  8. html 字符画,字符画

    字符画,一种由字母.标点.汉字或其他字符组成的图画.简单的字符画是利用字符的形状代替图画的线条来构成简单的人物.事物等形象,它一般由人工制作而成:复杂的字符画通常利用占用不同数量像素的字符代替图画上不 ...

  9. html 软键盘 页面高度,深入理解高度,获取屏幕、webview、软键盘高度

    如果没有手动调整过webview的高度的话,默认情况下,屏幕的高度=顶部状态栏的高度+webview的高度. 如果软键盘打开,则屏幕的高度=顶部状态栏的高度+webview的高度+软键盘的高度. HT ...

最新文章

  1. 给你一个亿的keys,Redis如何统计?
  2. Verilog篇(三)仿真原理
  3. 微型计算机中abcd是指,一级笔试模拟试题二(答案)
  4. DOS网络命令之 tracert
  5. Spring事务隔离级别,事务传播行为
  6. ie678,FF,chrome的css兼容性
  7. 官方正式预热小米10S:哈曼卡顿加持小米有史以来音质最好的手机
  8. Android编译环境(1) - 编译Native C的模块
  9. SQL SERVER如何通过SQL语句获服务器硬件和系统信息
  10. 【C语言】计算器实现
  11. 如何将几个pdf合并成一个pdf?
  12. html5中display flex,display:flex属性
  13. JPBC库(基于配对的密码学)入门和避坑指南
  14. 天津办理食品经营许可证的要求和材料
  15. Allegro如何导入高清Logo、二维码、防静电标识等图片以及汉字
  16. 【Vulkan学习记录-基础篇-1】用Vulkan画一个三角形
  17. Linux --VS Code安装与配置
  18. ADSL 登陆账号密码嗅探器
  19. 什么是工程建设的BLT模式
  20. APP报毒的自查方法

热门文章

  1. Bilibili到底有多少御坂妹?(一)
  2. 全程无尿点,死磕前端~
  3. iOS——调用系统相册和相机
  4. Vue+Echarts地图消失(高度变成0)的完美解决方案
  5. 使用echart画出渐变色饼图(圆环图环形渐变)
  6. Leetcode 32 最长合法括号子序列
  7. 只需98RMB Win7升级为专业版Win8
  8. QQ、微信消息定时发送/自动发送【支持发送文件】
  9. 微信小程序开发-微信支付之免密支付(自动扣费)一 小程序+java接口
  10. Android BaseQuickAdapter万能适配器