textView中判断文本长度,自定义表情长度为1,emoj表情长度为1,输入限制
2015-07-18 17:39
429 查看
staticconstintMAX_LIMIT_NUMS=100;/**<输入个数限制*/
//self.inputNumberTipsLabel控制器的view上一个用于展示输入数量提示的一个label
#pragmamark-UITextViewDelegate
-(BOOL)textView:(UITextView*)textViewshouldChangeTextInRange:(NSRange)range
replacementText:(NSString*)text
{
UITextRange*selectedRange1=[textViewmarkedTextRange];
//获取高亮部分
UITextPosition*pos=[textViewpositionFromPosition:selectedRange1.startoffset:0];
//获取高亮部分内容
//NSString*selectedtext=[textViewtextInRange:selectedRange];
//如果有高亮且当前字数开始位置小于最大限制时允许输入
if(selectedRange1&&pos){
NSIntegerstartOffset=[textViewoffsetFromPosition:textView.beginningOfDocumenttoPosition:selectedRange1.start];
NSIntegerendOffset=[textViewoffsetFromPosition:textView.beginningOfDocumenttoPosition:selectedRange1.end];
NSRangeoffsetRange=NSMakeRange(startOffset,endOffset-startOffset);
if(offsetRange.location<MAX_LIMIT_NUMS){
returnYES;
}
else
{
returnNO;
}
}
NSString*comcatstr=[textView.textstringByReplacingCharactersInRange:rangewithString:text];
//NSIntegercaninputlen=MAX_LIMIT_NUMS-comcatstr.length;
NSIntegercaninputlen=MAX_LIMIT_NUMS-[comcatstrgetStringLengthIfIsEmojiLengthAsOne];
if(caninputlen>=0)
{
returnYES;
}
else
{
//NSIntegerlen=text.length+caninputlen;
NSIntegerlen=[textgetStringLengthIfIsEmojiLengthAsOne]+caninputlen;
//防止当text.length+caninputlen<0时,使得rg.length为一个非法最大正数出错
NSRangerg={0,MAX(len,0)};
if(rg.length>0)
{
NSString*s=@"";
//判断是否只普通的字符或asc码(对于中文和表情返回NO)
BOOLasc=[textcanBeConvertedToEncoding:NSASCIIStringEncoding];
if(asc){
s=[textsubstringWithRange:rg];//因为是ascii码直接取就可以了不会错
}
else
{
__blockNSIntegeridx=0;
__blockNSString*trimString=@"";//截取出的字串
//使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个
[textenumerateSubstringsInRange:NSMakeRange(0,[textlength])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString*substring,NSRangesubstringRange,NSRangeenclosingRange,BOOL*stop){
//NSIntegersteplen=substring.length;
NSIntegersteplen=[substringgetStringLengthIfIsEmojiLengthAsOne];
if(idx>=rg.length){
*stop=YES;//取出所需要就break,提高效率
return;
}
trimString=[trimStringstringByAppendingString:substring];
idx=idx+steplen;
}];
s=trimString;
}
__blockBOOLhasAttachment=NO;
[textView.attributedTextenumerateAttributesInRange:NSMakeRange(0,textView.attributedText.length)options:NSAttributedStringEnumerationReverseusingBlock:^(NSDictionary*attrs,NSRangerange,BOOL*stop){
if(attrs[@"NSAttachment"])
{
*stop=YES;
hasAttachment=YES;
}
}];
if(textView.text.length>MAX_LIMIT_NUMS){
kToastWithString(@"输入已达上限")
if(hasAttachment){
[textView.attributedTextattributedSubstringFromRange:NSMakeRange(0,MAX_LIMIT_NUMS)];
}else{
//rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)
[textViewsetText:[textView.textstringByReplacingCharactersInRange:rangewithString:s]];
}
}
//既然是超出部分截取了,哪一定是最大限制了。
self.inputNumberTipsLabel.text=[NSStringstringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS];
}
if(textView.text.length>=MAX_LIMIT_NUMS){
kToastWithString(@"输入已达上限")
}
returnNO;
}
}
-(void)textViewDidChange:(UITextView*)textView
{
//占位文本显示与否
_submitEvaluationBtn.enabled=self.evaluationTextView.hasText;
UITextRange*selectedRange1=[textViewmarkedTextRange];
//获取高亮部分
UITextPosition*pos=[textViewpositionFromPosition:selectedRange1.startoffset:0];
//如果在变化中是高亮部分在变,就不要计算字符了
if(selectedRange1&&pos){
return;
}
NSString*nsTextContent=textView.text;
//NSIntegerexistTextNum=nsTextContent.length;
NSIntegerexistTextNum=[nsTextContentgetStringLengthIfIsEmojiLengthAsOne];
if(existTextNum>=MAX_LIMIT_NUMS)
{
kToastWithString(@"输入已达上限")
__blockBOOLhasAttachment=NO;
[textView.attributedTextenumerateAttributesInRange:NSMakeRange(0,textView.attributedText.length)options:NSAttributedStringEnumerationReverseusingBlock:^(NSDictionary*attrs,NSRangerange,BOOL*stop){
if(attrs[@"NSAttachment"])
{
*stop=YES;
hasAttachment=YES;
}
}];
if(hasAttachment){
textView.attributedText=[textView.attributedTextattributedSubstringFromRange:NSMakeRange(0,MAX_LIMIT_NUMS+[textView.textemojiCount])];
}else{
//截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)
NSString*s=[nsTextContentsubstringToIndex:(MAX_LIMIT_NUMS+[textView.textemojiCount])];
[textViewsetText:s];
}
}
//不让显示负数口口日
self.inputNumberTipsLabel.text=[NSStringstringWithFormat:@"%tu/%tu",MAX(0,MAX_LIMIT_NUMS-existTextNum),MAX_LIMIT_NUMS];
}
相关文章推荐
- 关于udo3d双目相机的嵌入式板子系统重装
- Android开发之应用程序窗体显示状态操作(requestWindowFeature()的应用)
- NSRunLoop 概述和原理
- 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
- WebApi有多个POSt方法。
- Android开发UI之android:gravity / android:layout_Gravity,android:padding / android:layout_margin属性区分
- 想法很重要
- USACO Combination Lock
- Wing IDE配置空格代替tab缩进+护眼背景色
- 全选,不全选JS
- 【TED】伟大的领袖如何激励行动
- 《学习OpenCV》第四章课后题3-a
- 事务
- JAVA基础 - 删除字符串中指定字符串的方法
- CSS3中颜色线性渐变实战
- HDU-1754-I Hate It-单点更新
- 求转子曲线所包围的封闭区域的面积
- 简单解决tomcat端口号被占用的问题
- bzoj1190
- Java并发之CountDownLatch、CyclicBarrier和Semaphore