XZ_iOS之UITextView或UITextField實時修改輸入的部分文字的顏色(下)
阿新 • • 發佈:2019-01-25
(都寫在一篇部落格上面,發現下部分直接沒有了,只能寫個下篇了)
優化:雖然輸入之後的文字的顏色改變了,但是在輸入顯示的過程中,文字的顏色還是跟前一個文字的文字屬性一樣的,查詢文件發現: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];
那我還能怎麼辦,查找了Stack Overflow,看到也有人遇到了相同的問題,然而並沒有找到答案。。。。有哪位好心人知道了可以告訴我一下,哈哈又有好心人告訴我了,說關鍵詞[]中間不能插入文字,這有什麼難的,我們可以使用核心繪圖,將關鍵詞轉換成圖片,再賦值給textView不就行了嘛,貼程式碼:NSDictionary *dict = @{ NSForegroundColorAttributeName:[UIColor blackColor], NSBackgroundColorAttributeName:[UIColor blackColor], NSFontAttributeName:[UIFont systemFontOfSize:20.0] }; [textView setMarkedTextStyle:dict];
NSMutableAttributedString有一個使用NSTextAttachment建立的方法,而這個attachment裡面又有一個image屬性,所以,完美的解決了我們的問題:+ (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; }
+ (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;
}
實現效果如下: