iOS UITextView限制输入字数并显示剩余字数
2016-05-26 11:47
507 查看
#define MAX_LIMIT_NUMS255
self.textNumLab为显示剩余字数的label
#pragma mark -限制病情描述输入字数(最多不超过255个字)
- (BOOL)textView:(UITextView
*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString
*)text{
//不支持系统表情的输入
if ([[textView textInputMode] primaryLanguage]==nil||[[[textView textInputMode] primaryLanguage]isEqualToString:@"emoji"])
{
returnNO;
}
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange.startoffset:0];
//获取高亮部分内容
//NSString * selectedtext = [textView textInRange:selectedRange];
//如果有高亮且当前字数开始位置小于最大限制时允许输入
if (selectedRange && pos) {
NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];
NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end];
NSRange offsetRange =NSMakeRange(startOffset,
endOffset - startOffset);
if (offsetRange.location
<MAX_LIMIT_NUMS) {
return YES;
}else{
return NO;
}
}
NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];
NSInteger caninputlen =MAX_LIMIT_NUMS
- comcatstr.length;
if (caninputlen >=0){
return YES;
}else{
NSInteger len = text.length
+ caninputlen;
//防止当text.length
+ caninputlen < 0时,使得rg.length为一个非法最大正数出错
NSRange rg = {0,MAX(len,0)};
if (rg.length
>0){
NSString *s =@"";
//判断是否只普通的字符或asc码(对于中文和表情返回NO)
BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];
if (asc) {
s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错
}else{
__block NSInteger
idx =0;
__block NSString
*trimString =@"";//截取出的字串
//使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个
[text enumerateSubstringsInRange:NSMakeRange(0,
[text length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock: ^(NSString*
substring,NSRange substringRange,NSRange
enclosingRange,BOOL* stop) {
if (idx >=
rg.length) {
*stop =YES;//取出所需要就break,提高效率
return
;
}
trimString = [trimString stringByAppendingString:substring];
idx++;
}];
s = trimString;
}
//rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)
[textView setText:[textView.text stringByReplacingCharactersInRange:rangewithString:s]];
//既然是超出部分截取了,哪一定是最大限制了。
self.textNumLab.text
= [NSString stringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS];
}
returnNO;
}
}
#pragma mark -显示当前可输入字数/总字数
- (void)textViewDidChange:(UITextView
*)textView{
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange.startoffset:0];
//如果在变化中是高亮部分在变,就不要计算字符了
if (selectedRange && pos) {
return;
}
NSString *nsTextContent = textView.text;
NSInteger existTextNum = nsTextContent.length;
if (existTextNum >MAX_LIMIT_NUMS){
//截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)
NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS];
[textViewsetText:s];
}
//不让显示负数
self.textNumLab.text
= [NSStringstringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS
- existTextNum),MAX_LIMIT_NUMS];
}
效果如图:
参考地址:http://www.it165.net/pro/html/201505/39736.html
self.textNumLab为显示剩余字数的label
#pragma mark -限制病情描述输入字数(最多不超过255个字)
- (BOOL)textView:(UITextView
*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString
*)text{
//不支持系统表情的输入
if ([[textView textInputMode] primaryLanguage]==nil||[[[textView textInputMode] primaryLanguage]isEqualToString:@"emoji"])
{
returnNO;
}
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange.startoffset:0];
//获取高亮部分内容
//NSString * selectedtext = [textView textInRange:selectedRange];
//如果有高亮且当前字数开始位置小于最大限制时允许输入
if (selectedRange && pos) {
NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];
NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end];
NSRange offsetRange =NSMakeRange(startOffset,
endOffset - startOffset);
if (offsetRange.location
<MAX_LIMIT_NUMS) {
return YES;
}else{
return NO;
}
}
NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];
NSInteger caninputlen =MAX_LIMIT_NUMS
- comcatstr.length;
if (caninputlen >=0){
return YES;
}else{
NSInteger len = text.length
+ caninputlen;
//防止当text.length
+ caninputlen < 0时,使得rg.length为一个非法最大正数出错
NSRange rg = {0,MAX(len,0)};
if (rg.length
>0){
NSString *s =@"";
//判断是否只普通的字符或asc码(对于中文和表情返回NO)
BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];
if (asc) {
s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错
}else{
__block NSInteger
idx =0;
__block NSString
*trimString =@"";//截取出的字串
//使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个
[text enumerateSubstringsInRange:NSMakeRange(0,
[text length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock: ^(NSString*
substring,NSRange substringRange,NSRange
enclosingRange,BOOL* stop) {
if (idx >=
rg.length) {
*stop =YES;//取出所需要就break,提高效率
return
;
}
trimString = [trimString stringByAppendingString:substring];
idx++;
}];
s = trimString;
}
//rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)
[textView setText:[textView.text stringByReplacingCharactersInRange:rangewithString:s]];
//既然是超出部分截取了,哪一定是最大限制了。
self.textNumLab.text
= [NSString stringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS];
}
returnNO;
}
}
#pragma mark -显示当前可输入字数/总字数
- (void)textViewDidChange:(UITextView
*)textView{
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange.startoffset:0];
//如果在变化中是高亮部分在变,就不要计算字符了
if (selectedRange && pos) {
return;
}
NSString *nsTextContent = textView.text;
NSInteger existTextNum = nsTextContent.length;
if (existTextNum >MAX_LIMIT_NUMS){
//截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)
NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS];
[textViewsetText:s];
}
//不让显示负数
self.textNumLab.text
= [NSStringstringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS
- existTextNum),MAX_LIMIT_NUMS];
}
效果如图:
参考地址:http://www.it165.net/pro/html/201505/39736.html
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- extjs form textfield的隐藏方法
- Android的TextView与Html相结合的具体方法
- Android中实现为TextView添加多个可点击的文本
- android textview 显示html方法解析
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android实现TextView中文字链接的4种方式介绍及代码
- android TextView属性的详细介绍 分享
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略