UITextField限制中英文字数和光标定位以及第三方输入限制问题
先自定义一个UITextField的子类HLNavTextField,在控制器里调用子类的- (void)limitHansLength:(int)hans otherLength:(int)other方法来限制字数。
1、[UITextInputMode currentInputMode] -->不同输入法下返回的内容:
系统自带键盘:英文下返回en-US,中文下返回zh-Hans;
搜狗输入法:中英文下都返回zh-Hans;
百度输入法:中英文下都返回zh_CN;
GO输入法:中英文下都返回mul;
2、textField.textInputMode.primaryLanguage --> 不同输入法下返回的内容:
系统自带键盘:英文下返回en-US,中文下返回zh-Hans,emoji下返回nil;
搜狗输入法:中英文下都返回zh-Hans;
百度输入法:中英文下都返回zh_CN;
GO输入法:中英文下都返回mul;
#import <UIKit/UIKit.h> @interface HLNavTextField : UITextField
- (void)limitHansLength:(int)hans otherLength:(int)other; // hans:系统中文和emoji的限制数、第三方输入法中英文限制数;other:系统自带输入法英文输入状态的限制;
@end
从我自己的项目中抽出来的,没有经过单独测试。
#import "HLNavTextField.h" @interface HLNavTextField ()
@property (assign, nonatomic) int hans;
@property (assign, nonatomic) int other;
@end @implementation HLNavTextField // 用于更改Placeholder的文字大小、颜色、位置
- (void)drawPlaceholderInRect:(CGRect)rect {
NSAttributedString *placeholder = self.attributedPlaceholder;
NSRange range = NSMakeRange(, self.placeholder.length);
NSMutableDictionary *dict = [placeholder attributesAtIndex: effectiveRange:&range].mutableCopy;
dict[NSForegroundColorAttributeName] = [UIColor orangeColor];
dict[NSFontAttributeName] = [UIFont systemFontOfSize:];
CGRect myRect = CGRectMake(rect.origin.x + , rect.origin.y + , rect.size.width, rect.size.height);
[[self placeholder] drawInRect:myRect withAttributes:dict];
} // 注意区别初始化方式
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
self.hans = -;
self.other = -;
// 初始化时添加监听文字的改变
[self addTarget:self action:@selector(searchDidChange:) forControlEvents:UIControlEventEditingChanged];
}
return self;
} - (void)limitHansLength:(int)hans otherLength:(int)other {
self.hans = hans; // 设置中文状态下的限制字数
self.other = other; // 设置状态下的限制字数
} - (void)searchDidChange:(UITextField *)textField {
// 判断输入状态是否为英文
if (![textField.textInputMode.primaryLanguage isEqualToString:@"en-US"]) {
// 过滤掉输入时高亮状态下的情况
if (!textField.markedTextRange && (self.hans >= ) && (textField.text.length > self.hans)) {
[self setCaretPositionWithTextField:textField limit:self.hans];
}
} else {
// 英文输入状态下
if ((self.other >= ) && (textField.text.length > self.other)) {
[self setCaretPositionWithTextField:textField limit:self.other];
}
}
}
- (void)setCaretPositionWithTextField:(UITextField *)textField limit:(NSUInteger)length {
// 拿到截取之前的光标位置
UITextPosition *selectedPosition = textField.selectedTextRange.start;
// 截取限制字数以内的文本
textField.text = [textField.text substringToIndex:length];
// 恢复光标的位置
textField.selectedTextRange = [textField textRangeFromPosition:selectedPosition toPosition:selectedPosition];
} @end
支持插入文字、选中替换文字、联想输入文字,光标定位到新输入的文字后。
UITextField限制中英文字数和光标定位以及第三方输入限制问题的更多相关文章
- Vim光标定位
*定位到指定行n: 输入"nG". 或输入"ngg". 或输入":n" 这里,n就是指定的行的行号.注意,有时候G=gg. *跳到屏幕顶部: ...
- input长度随输入内容动态变化 input光标定位在最右侧
<input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(this. ...
- input输入框的光标定位的问题
input输入框的光标定位的问题 在给input输入框赋值的时候,或者在我之前写模拟下拉框js组件的时候,时不时会碰到光标的小bug问题,比如键盘中的 上移或者下移操作,在浏览器中光标会先移到最前端, ...
- js实现类似微信网页版在可编辑的div中粘贴内容时过滤剪贴板的内容,光标始终在粘贴内容后面,以及将光标定位到最后的方法
过滤剪贴板内容以及定位可编辑div光标的方法: <!DOCTYPE html><html lang="en"><head> <meta ...
- UITextView 光标定位
在使用UITextView的时候, 如何在光标的位置插入字符 或者 图片? 以下Demo为你解答: 应用背景:键盘自定义emoji表情 #pragma mark - KVO - (void)obser ...
- UITextField/UITextView限制字数
一,UITextFild限制字数(三步) 1,给textfild添加响应事件,类型为:UIControlEventEditingChanged [self.nickNameFild addTarget ...
- 可编辑div,将光标定位到文本之后
类似qq回复一样,某人评论之后,在对评论进行回复之后,将光标定位到文本之后: function set_focus() { el=document.getElementById('guestbook_ ...
- JS控制光标定位,定位到文本的某个位置
这是一个数字密码,要能够智能的跳转到文本的某个位置,就需要通过JS来控制跳转! 1.onkeyup监听 <input class="put" id="number- ...
- TextBox光标定位到文本末尾
private void RichTextBox1_TextChanged(object sender, EventArgs e) { this.richTextBox1.Select(richTex ...
随机推荐
- 我的vim配置文件
强烈拥护开源精神,高举开源大旗,今天我就分享下我自己结合网上还有自己实际使用配的vimrc,可以给各位参考下,不要见笑,具体说明我在rc里写的也很详细,可以具体看下,也希望可以借这个机会能多认识认识几 ...
- MVC EF中Attach和Entry区别
EF:加入容器三种方式-->查询,attach,entry.不在容器里,不能用remove,add等方法. 1.0 使用Attach可能会出错.//attach 意思:附上; 贴上,系;var ...
- js jquery 异常
1.0 TypeError: $(...).carousel is not a function原因:可能是没有引用或者引用了多个jquery:<script src="~/js/jq ...
- Widget的点击事件
本文实现Widget中的按钮点击事件,点击一次下面的按钮,上面的数字减少1. 首先是Manifest文件: <?xml version="1.0" encoding=&quo ...
- mysql命令行基本操作
开启:打开电脑的“开始”菜单栏,找到“运行”,在运行框中直接输入:net start mysql.再 登录:Mysql -P 端口号 -h mysql主机名\ip -u root (用户) - ...
- ios 根据文字数量计算UILabel高度(已修改)
由于留言的朋友给出了更好的方法,所以下面的代码都是它留言中给出的,优于我前面计算Lable高度方法,这个可以说非常的准,是IOS自带的计算UILABEL高度的方式. 一.实现代码 // 创建label ...
- Scalaz(47)- scalaz-stream: 深入了解-Source
scalaz-stream库的主要设计目标是实现函数式的I/O编程(functional I/O).这样用户就能使用功能单一的基础I/O函数组合成为功能完整的I/O程序.还有一个目标就是保证资源的安全 ...
- Fiddler (四) 实现手机的抓包
Fiddler是我最喜爱的工具,几乎每天都用, 我已经用了8年了. 至今我也只学会其中大概50%的功能. Fiddler绝对称得上是"神器", 任何一个搞IT的人都得着的. 小 ...
- Java经典实例:在文本中匹配换行符
默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTI ...
- 把Java生成的RSA公钥、私钥转换成.NET使用的XML格式
import java.security.KeyFactory; import java.security.interfaces.RSAPrivateCrtKey; import java.secur ...