您的位置:首页 > 其它

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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: