先自定义一个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限制中英文字数和光标定位以及第三方输入限制问题的更多相关文章

  1. Vim光标定位

    *定位到指定行n: 输入"nG". 或输入"ngg". 或输入":n" 这里,n就是指定的行的行号.注意,有时候G=gg. *跳到屏幕顶部: ...

  2. input长度随输入内容动态变化 input光标定位在最右侧

    <input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(this. ...

  3. input输入框的光标定位的问题

    input输入框的光标定位的问题 在给input输入框赋值的时候,或者在我之前写模拟下拉框js组件的时候,时不时会碰到光标的小bug问题,比如键盘中的 上移或者下移操作,在浏览器中光标会先移到最前端, ...

  4. js实现类似微信网页版在可编辑的div中粘贴内容时过滤剪贴板的内容,光标始终在粘贴内容后面,以及将光标定位到最后的方法

    过滤剪贴板内容以及定位可编辑div光标的方法: <!DOCTYPE html><html lang="en"><head>  <meta ...

  5. UITextView 光标定位

    在使用UITextView的时候, 如何在光标的位置插入字符 或者 图片? 以下Demo为你解答: 应用背景:键盘自定义emoji表情 #pragma mark - KVO - (void)obser ...

  6. UITextField/UITextView限制字数

    一,UITextFild限制字数(三步) 1,给textfild添加响应事件,类型为:UIControlEventEditingChanged [self.nickNameFild addTarget ...

  7. 可编辑div,将光标定位到文本之后

    类似qq回复一样,某人评论之后,在对评论进行回复之后,将光标定位到文本之后: function set_focus() { el=document.getElementById('guestbook_ ...

  8. JS控制光标定位,定位到文本的某个位置

    这是一个数字密码,要能够智能的跳转到文本的某个位置,就需要通过JS来控制跳转! 1.onkeyup监听 <input class="put" id="number- ...

  9. TextBox光标定位到文本末尾

    private void RichTextBox1_TextChanged(object sender, EventArgs e) { this.richTextBox1.Select(richTex ...

随机推荐

  1. 【读书笔记】--SQL基础概念复习

    主键:每个表,只能有一个主键,主键不能为NULL,且必须是唯一的.主键最好是由单个列组成,但这不是必须的,主键也可以是由多个列组成,如果表的两个列组合在一起能唯一标识一个行,而单个列不能,则可以将这两 ...

  2. DirectShowNet 使用摄像头录像+录音

    http://www.cnblogs.com/endv/p/6052511.html // ------------------------------------------------------ ...

  3. Android 获取可靠的手机编码

    项目中出现了将设备和用户信息进行绑定的需求.最先想到的是IMEI串码和IMSI串码.手机登陆的时候一直都没有问题.换了一个平板中之后IMEI和IMSI串码都获取不到了.后来查了一下原因,是因为平板上是 ...

  4. Microsoft Visual Studio Ultimate 2013 Update 2 RC 英文版--离线完整安装ISO+简体中文语言包

    VS2013.2_RC_EN_Full.iso:名称:Microsoft Visual Studio 2013版本:Ultimate 2013 Update 2 RC语言:English在线下载:ht ...

  5. 关于JQuery(最后一点动画效果*)

    1,$(':radio').val(['1','2','3']);//特殊写法,把值为1 2 3的都选中. 2,math.abs(len)取绝对值 3,按钮高亮显示,一般是配置两个按钮,一个普通的,一 ...

  6. CPU介绍

    CPU内核主要分为两部分:运算器和控制器. (一) 运算器 cpu基本想到的是计算,因此有算数计算,还有逻辑计算单元以及移位简单的运算:fp运算单独拿出:要运算就需要输入数字,因此有寄存器组,即通用寄 ...

  7. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  8. 【Effective Java】11、同步访问共享的可变数据

    这段时间看的部分感觉没啥需要记录下来的,个人也没什么想法,不过以后还是要多记,多写 package cn.xf.cp.ch02.item66; import java.util.concurrent. ...

  9. socket.io,理解socket.io

    原文:http://www.cnblogs.com/xiezhengcai/p/3957314.html 要理解socket.io ,不得不谈谈websocket 在html5之前,因为http协议是 ...

  10. Java在方法作用域内创建的内部类

    在方法作用域内创建的内部类,用来实现一个接口 /** * Created by xfyou on 2016/11/3. * Java内部类演示 */ public class Parcel3 { pu ...