1. 程式人生 > >XZ_iOS之UITextView或UITextField實時修改輸入的部分文字的顏色(下)

XZ_iOS之UITextView或UITextField實時修改輸入的部分文字的顏色(下)

(都寫在一篇部落格上面,發現下部分直接沒有了,只能寫個下篇了)

優化:雖然輸入之後的文字的顏色改變了,但是在輸入顯示的過程中,文字的顏色還是跟前一個文字的文字屬性一樣的,查詢文件發現:textView有一個markedTextStyle屬性,這個屬性的值是一個字典,字典的key值是下圖中所示:

使用如下程式碼,然而並沒有任何作用:
 // 修改高亮時字型顏色
    [textView.markedTextStyle setValue:[UIColor blackColor] forKey:NSForegroundColorAttributeName];
    [textView.markedTextStyle setValue:[UIColor blackColor] forKey:NSBackgroundColorAttributeName];
    [textView.markedTextStyle setValue:[UIFont systemFontOfSize:20.0] forKey:NSFontAttributeName];
那換一種寫法試試,使用如下程式碼,只能修改背景色,字型顏色不起作用。不要問我為什麼,因為我也不知道。
NSDictionary *dict = @{
                           NSForegroundColorAttributeName:[UIColor blackColor],
                           NSBackgroundColorAttributeName:[UIColor blackColor],
                           NSFontAttributeName:[UIFont systemFontOfSize:20.0]
                           };
    [textView setMarkedTextStyle:dict];
那我還能怎麼辦,查找了Stack Overflow,看到也有人遇到了相同的問題,然而並沒有找到答案。。。。有哪位好心人知道了可以告訴我一下,哈哈又有好心人告訴我了,說關鍵詞[]中間不能插入文字,這有什麼難的,我們可以使用核心繪圖,將關鍵詞轉換成圖片,再賦值給textView不就行了嘛,貼程式碼:
+ (UIImage *)makeTextToImage:(NSString *)text font:(CGFloat)fontSize {
    UIFont *font = [UIFont systemFontOfSize:fontSize];
    
    CGFloat height = font.lineHeight;
    
    NSDictionary *attrDict = @{
                               NSFontAttributeName:font,
                               NSForegroundColorAttributeName:kXZMainBgColor,
                               NSBackgroundColorAttributeName:[UIColor greenColor]
                               };
    CGSize stringSize = [text sizeWithAttributes:attrDict];
    
    UIGraphicsBeginImageContextWithOptions(stringSize, NO, 0.0);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetCharacterSpacing(ctx, 10);
    CGContextSetTextDrawingMode (ctx, kCGTextFillStroke);
    CGContextSetRGBFillColor (ctx, 0.1, 0.2, 0.3, 1); // 6
    CGContextSetRGBStrokeColor (ctx, 0, 0, 0, 1);
    
    CGRect rect = CGRectMake(0, 0, stringSize.width , height);
    [text drawInRect:rect withAttributes:attrDict];
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}
NSMutableAttributedString有一個使用NSTextAttachment建立的方法,而這個attachment裡面又有一個image屬性,所以,完美的解決了我們的問題:
+ (void)xz_makeWordsAnotherColor:(NSString *)attributeText color:(UIColor *)color view:(UITextView *)textView {
    // 獲取當前 textView 屬性文字 => 可變的
    NSMutableAttributedString *attrStrM = [[NSMutableAttributedString alloc] initWithAttributedString:textView.attributedText];
    
    // 建立屬性文字
    XZTextAttachment *attachment = [[XZTextAttachment alloc] init];
    attachment.image = [self makeTextToImage:attributeText font: 13.0];
    attachment.chs = attributeText;
    
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithAttributedString: [NSAttributedString attributedStringWithAttachment:attachment]];
// 記錄游標位置
    NSRange range = textView.selectedRange;
    // 將屬性文字插入到當前的游標位置
    [attrStrM replaceCharactersInRange:range withAttributedString:attrStr];
    // 設定文字
    textView.attributedText = attrStrM;
    // 恢復游標位置
    NSRange rangeNow = NSMakeRange(range.location + 1, 0);
    
    textView.selectedRange = rangeNow;
}

實現效果如下: