// // STTableTextViewCell.m // BuguLive // // Created by 岳克奎 on 17/4/18. // Copyright © 2017年 xfg. All rights reserved. // #import "STTableTextViewCell.h" @implementation STTableTextViewCell - (void)awakeFromNib { [super awakeFromNib]; // Initialization code //初始化部分 [self setSubView]; // self.textView.textColor = kBlackColor; } #pragma mark - 初始化部分 -(void)setSubView{ self.textView.delegate = self; } #pragma mark ------将要开始编辑 -(BOOL)textViewShouldBeginEditing:(UITextView *)textView{ if ([textView.text isEqualToString: ASLocalizedString(@"这一刻你的想法")]) { textView.text = @""; textView.textColor = kBlackColor; } return YES; } #pragma mark -将要结束编辑 -(BOOL)textViewShouldEndEditing:(UITextView *)textView{ return YES; } #pragma mark -开始编辑 -(void)textViewDidBeginEditing:(UITextView *)textView{ } #pragma mark -结束编辑 /** * @brief: 结束编辑,需要回传数据 * * */ -(void)textViewDidEndEditing:(UITextView *)textView{ if (textView.text.length == 0) { textView.text = ASLocalizedString(@"这一刻你的想法"); textView.textColor = [UIColor colorWithHexString:@"#ABABAB"]; } if (_delegate &&[_delegate respondsToSelector:@selector(showSTTableTextViewCell:)]) { [_delegate showSTTableTextViewCell:self]; } } #pragma mark -内容将要发生改变编辑 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ //不支持系统表情的输入 if ([[textView textInputMode] primaryLanguage]==nil||[[[textView textInputMode] primaryLanguage]isEqualToString:@"emoji"]) { return NO; } UITextRange *selectedRange = [textView markedTextRange]; //获取高亮部分 UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0]; 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 =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:range withString:s]]; //既然是超出部分截取了,哪一定是最大限制了。 //self.showWordsNumLab.text = [NSString stringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS]; self.showWordsNumLab.text = @"100/100"; } return NO; } return YES; } #pragma mark -内容发生改变编辑(-显示当前可输入字数/总字数) -(void)textViewDidChange:(UITextView *)textView{ UITextRange *selectedRange = [textView markedTextRange]; //获取高亮部分 UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset: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]; [textView setText:s]; } //不让显示负数 self.showWordsNumLab.text = [NSString stringWithFormat:@"%ld/100", existTextNum]; // self.showWordsNumLab.text = [NSString stringWithFormat:@"%ld/100",(MAX_LIMIT_NUMS - existTextNum)]; //self.showWordsNumLab.text = [NSString stringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS - existTextNum),MAX_LIMIT_NUMS]; } #pragma mark ************************** Setter ************************* #pragma mark -- STTableTextViewCellDeleagte -(void)setDelegate:(id)delegate{ _delegate = delegate; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } @end