iOS UITextView设置富文本不能输入中文问题

项目中我们会经常使用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]);
    
}
原文地址:https://www.cnblogs.com/lijianyi/p/14068434.html