NT_iOS笔记—CoreText添加文字背景色(搜索的高亮显示)

转载请标明出处:http://blog.csdn.net/nt_tian/article/details/42458647

在CoreText里进行全文搜索,搜索的结果需要高亮显示,这个已经是很普遍的做法了。

在搜索结果列表中可以通过UILabel直接显示

[attributedString addAttribute: NSBackgroundColorAttributeName value:[UIColor orangeColor] range:range];
_conLabel.attributedText=attributedString;
但是当我开始进行CoreText文字高亮显示的时候发现了一个问题,CoreText对NSMutableAttributedString 中的NSBackgroundColorAttributeName属性不支持。
网上查了一下,CoreText的文字背景色需要自己手动的画上去。

好吧,那就只能自己画了,上代码:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
NSArray *lines = (NSArray *)CTFrameGetLines((CTFrameRef)NCTFrame);
    if (lines.count)
    {
        CGPoint *lineOrigins = malloc(lines.count * sizeof(CGPoint));
        CTFrameGetLineOrigins((CTFrameRef)NCTFrame, CFRangeMake(0, lines.count), lineOrigins);
        int i = 0;
        for (id aLine in lines)
        {
            NSArray *glyphRuns = (NSArray *)CTLineGetGlyphRuns((CTLineRef)aLine);
            CGFloat width =lineOrigins[i].x-lineOrigins[0].x;
            CGFloat height =lineOrigins[i].y;
            for (id run in glyphRuns)
            {
                CFDictionaryRef dicRef=CTRunGetAttributes((CTRunRef)run);
                NSDictionary *dic=(__bridge NSDictionary *)dicRef;
                if ([dic objectForKey:@"NSBackgroundColor"]!=nil&&_isSearch==YES)
                {
                    UIColor *BGColor=[dic objectForKey:@"NSBackgroundColor"];
                    CGPoint *ary=(CGPoint *)CTRunGetPositionsPtr((CTRunRef)run);
                    float lineheight;
                    if (lines.count>=2)
                    {
                        lineheight=lineOrigins[lines.count-2].y-lineOrigins[lines.count-1].y;
                    }
                    else
                    {
                        lineheight=28;
                    }
                    float RunWidth=CTRunGetTypographicBounds((CTRunRef)run, CFRangeMake(0, 0), NULL, NULL, NULL);
                    CGRect rectangle = CGRectMake(ary[0].x, height-8, RunWidth, lineheight);
                    CGContextSetFillColorWithColor(context,BGColor.CGColor);
                    CGContextFillRect(context , rectangle);
                    
//                    绘制矩形框
//                    CGContextSetStrokeColorWithColor(context, [BGColor CGColor]);//边框色
//                    CGContextAddRect(context, rectangle);
//                    CGContextStrokePath(context);//绘制
                    
                }
                ......
            }
            i++;
        }
        
        free(lineOrigins);
    }
}

这里还遇到了一个问题暂时没有找到好的方法:在获取行高的时候,没有找到什么好的方法。

如果谁知道可以告诉我,我也可以学习改进一下。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。