项目中我们会经常使用UITextView输入文本,正常使用比较简单,但往往设计的妹子会提出调个行间距呀之类的问题,此刻我们就不得不设置富文本来实现这个效果,下面就简述下我的采坑之路。
其实最重要的就是要知道中文输入情况下有没有候选字符。
主要是使用markedTextRang这个属性,markedTextRange不等于空时表示有候选字符,等于空表示没有候选字符
@property (nullable, nonatomic, readonly) UITextRange *markedTextRange; // Nil if no marked text.
话不多说直接上代码
#pragma mark - UITextViewDelegate - (void)textViewDidChange:(UITextView *)textView { CGFloat maxLength = 2000; NSString *toBeString = textView.text; // markedTextRange不等于空时表示有候选字符,等于空表示没有候选字符 //获取高亮部分 UITextRange *selectedRange = [textView markedTextRange]; UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0]; if (!position || !selectedRange) { if (toBeString.length > maxLength) { NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:maxLength]; if (rangeIndex.length == 1) { textView.text = [toBeString substringToIndex:maxLength]; } else { NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLength)]; textView.text = [toBeString substringWithRange:rangeRange]; } } // 替换富文本(此时已无候选字符,用户已确定输入内容) NSMutableAttributedString *resutlAtt = [ICKRegularTool setTextStrWithContentStr:textView.text normalFont:FF_PFR_ICOME(16) normalColor:XZWL_COLOR_333333 lineSpacing:5]; textView.attributedText = resutlAtt; } // 替换富文本 写在这里会不能输入中文 因为还有候选字符(就是用户还没有确定输入的内容) // NSMutableAttributedString *resutlAtt = [ICKRegularTool setTextStrWithContentStr:textView.text normalFont:FF_PFR_ICOME(16) normalColor:XZWL_COLOR_333333 lineSpacing:5]; // textView.attributedText = resutlAtt; float textViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, MAXFLOAT)].height; CGRect frame = textView.frame; frame.size.height = textViewHeight; textView.frame = frame; if(textView.text.length == 0){//显示占位文字 self.textViewPlaceLabel.hidden = NO; }else{ self.textViewPlaceLabel.hidden = YES; } if([self.delegate respondsToSelector:@selector(carrerCircleTaskDesCellReloadTableviewForIndex:)]){ [self.delegate carrerCircleTaskDesCellReloadTableviewForIndex:_indexPath]; } _iCKCreateFullTaskModel.taskName = ObjErrorCheck([textView.text stringDeleteEndsWhiteSpace]); }