最近產(chǎn)品提了一個(gè)很無奈的需要,顯示某一段文字中的一句迎瞧,而且高亮顯示關(guān)鍵字夸溶。
額,好吧凶硅。
開始以為微信用了某個(gè)iOS SDK現(xiàn)有功能缝裁,想了好半天,想不出足绅。等晚上回家捷绑,連接上Reveal,看了一眼编检,我去胎食,微信竟然將前后的字符都給截掉了,只保留了需要顯示部分允懂。好吧厕怜,那我也這么做
寫在了UILabel的分類的里面
直接使用:
- (NSAttributedString *)keyLineWithKeyword:(NSString *)keyword
就好了。
IMG_2423.PNG
2293362-aaa31a1a605f2675.png
- (NSAttributedString *)keyLineWithKeyword:(NSString *)keyword
{
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.alignment = NSTextAlignmentLeft;//設(shè)置對(duì)齊方式
paragraph.lineBreakMode = NSLineBreakByCharWrapping;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.text attributes:@{NSFontAttributeName : self.font,NSForegroundColorAttributeName : [UIColor blackColor],NSParagraphStyleAttributeName : paragraph}];
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0, 0, self.frame.size.width, MAXFLOAT));
NSInteger length = attributedString.length;
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, length), path, NULL);
NSString *lineString = [self keyLineForKeyword:keyword frame:frame text:self.text];
CFRelease(frame);
CFRelease(path);
CFRelease(frameSetter);
UIColor *color = [UIColor colorWithRed:((0x0076DA>>16)&0xFF)/255.0 green:((0x0076DA>>8)&0xFF)/255.0 blue:(0x0076DA&0xFF)/255.0 alpha:1.0];
NSRange keywordRange = [lineString rangeOfString:keyword];
NSMutableAttributedString *ret = [[NSMutableAttributedString alloc] initWithString:lineString attributes:@{NSFontAttributeName:self.font, NSForegroundColorAttributeName:self.textColor}];
[ret addAttribute:NSForegroundColorAttributeName value:color range:keywordRange];
return ret;
}
- (NSString *)keyLineForKeyword:(NSString *)keyword frame:(CTFrameRef)frame text:(NSString *)text
{
NSString *lineString;
NSArray * arrLines = (NSArray *)CTFrameGetLines(frame);
NSInteger count = [arrLines count];
CGPoint points[count];
CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), points);
// static NSString *ellipsis = @"...";
if (count > 1) {
for (int i = 0; i < count; i ++) {
CTLineRef line = (__bridge CTLineRef)arrLines[i];
CFRange cfRange = CTLineGetStringRange(line);
NSRange tmpRange = NSMakeRange(cfRange.location, cfRange.length);
NSString *string = [text substringWithRange:tmpRange];
if ([string containsString:keyword]) {
// BOOL firstLine = i==0 ? true : false;
// BOOL lastLine = (i+1)==count ? true : false;
// NSString *beginWord;
// NSRange keywordRange = [string rangeOfString:keyword];
// if (firstLine == false) {
// // 不是在前三位
// if (string.length > ellipsis.length && keywordRange.location > ellipsis.length) {
// beginWord = [string substringWithRange:NSMakeRange(ellipsis.length-1, string.length-ellipsis.length)];
// string = [NSString stringWithFormat:@"%@%@",ellipsis,beginWord];
// }
// }
// if (lastLine==false) {
// // 不是在后三位
// if (string.length > ellipsis.length) {
// if ((keywordRange.location + keyword.length) < (string.length-keywordRange.length)) {
// beginWord = [string substringWithRange:NSMakeRange(0, string.length-ellipsis.length)];
// string = [NSString stringWithFormat:@"%@%@",beginWord,ellipsis];
// }
// }
// }
lineString = string;
break;
}
}
}else{
lineString = text;
}
return lineString;
}