UITextField的光标操作扩展(UITextRange,UITextPosition)(处理限定字数输入)
来源:互联网 发布:centos开机进入grub 编辑:程序博客网 时间:2024/04/20 08:08
转自:http://blog.csdn.net/xyt8023y/article/details/48879985
简介
在iOS开发中,有时候需要完全自主的定义键盘,用于完整的单词输入,例如计算机应用中,需要一次性的输入sin(,在移动光标时要完整的跳过sin(,在删除时也要完整的删除,这就需要对光标的位置进行精确控制,而iOS并没有相关的函数可以直接操作光标,只给出了选择某个区域的功能,本文将介绍基于区域选择设计的UITextField扩展,用于获取光标位置以及移动光标。
实现原理
光标位置的获取
在textField中,有一个属性称之为selectedTextRange,这个属性为UITextRange类型,包含[start,end)两个值,通过实验我们可以发现,在没有文字被选取时,start代表当前光标的位置,而end=0;当有区域被选择时,start和end分别是选择的头和尾的光标位置,从0开始,并且不包含end,例如选择了0~3的位置,则start=0,end=4。光标的移动
通过setSelectedTextRange:方法可以设置选取范围,我们只要设置一个选取单个字符的范围,即可移动光标而不选中。
关键属性
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
关键方法
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
具体实现
- 下面的代码为UITextField创建了一个分类(Category),包含三个方法,分别用于获取光标位置、从当前位置偏移、从头偏移。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
首先监听UITextfield值的改变有以下三种方法:
1、KVO方式
[textField addObserver:self forKeyPath:@"text" options:0 context:nil];
2、直接添加监视
[textField addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventAllEditingEvents];
3、注册消息通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldChanged:) name:UITextFieldTextDidChangeNotification object:textField];
此方法有局限,1能监听输入框的直接赋值,2 3能监听输入框的输入.
此外就是可以使用ReactiveCocoa,来同时监听输入和赋值
此外就是,使用textview的代理方法,
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
name:@"UITextFieldTextDidChangeNotification"
object:myTextField];
NSString *toBeString = textField.text;
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textField markedTextRange];
//获取高亮部分
UITextPosition *position = [textFieldpositionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if (toBeString.length > kMaxLength) {
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
// 有高亮选择的字符串,则暂不对文字进行统计和限制
else{
}
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else{
if (toBeString.length > kMaxLength) {
textField.text = [toBeString substringToIndex:kMaxLength];
}
}
}
name:@"UITextFieldTextDidChangeNotification"
object:_albumNameTextField];
}
- UITextField的光标操作扩展(UITextRange,UITextPosition)(处理限定字数输入)
- 限定UITextField输入的字数
- 限定UITextfield的输入字符的格式和字数
- IOS 学习之 限定UITEXTField输入字数
- 限制UITextField的输入字数
- 限制UITextField输入的字数
- (一三〇)UITextField的光标操作扩展
- 设置textField只能输入限定的字数
- textField限定输入字数
- ios--uitextfield动态限制输入的字数
- 限制一个UITextField的输入字数
- 限制一个UITextField的输入字数
- iOS限定UITextField的输入格式
- 限定UITextField输入的字节长度
- 限制UITextField输入字数
- UITextField 限制输入字数
- 限制UITextField 输入字数
- UITextField 限制输入字数
- Android studio 2.3版本出现的问题: Please select at least one of the signature versions to use
- MyBatis06--mybatis-generator自动生成代码
- Linux下如何进入MySQL小样例
- 计算成就价值_数据实现梦想——达科在DT时代转型历程的分享
- Bootstrap学习-bootstrap渲染表单+bootstrap导航栏
- UITextField的光标操作扩展(UITextRange,UITextPosition)(处理限定字数输入)
- oracle--PLSQL的应用实例
- BZOJ 2179: FFT快速傅立叶
- ubuntu dhcp服务器固定用户主机IP地址
- mui对话框
- 环境搭建arm-linux-gcc 没有那个文件或目录的问题
- WEB的mavan项目构建生成可执行jar包
- Java实现串口数据读写
- oracle数据库的备份还原标准化实施部署指南