iOS 上 NSAttributedString 中类似 NSBackgroundColorAttributeName 的属性?

发布于 2024-11-24 18:33:22 字数 274 浏览 3 评论 0原文

我计划使用 NSAttributedString 来突出显示与用户搜索的匹配查询的字符串部分。但是,我找不到与 NSBackgroundColorAttributeName 等效的 iOS 版本 - 没有 kCTBackgroundColorAttributeName。是否存在这样的事情,类似于 NSForegroundColorAttributeName 变成 kCTForegroundColorAttributeName

I was planning on using NSAttributedString to highlight portions of strings with the matching query of a user's search. However, I can't find an iOS equivalent of NSBackgroundColorAttributeName—there's no kCTBackgroundColorAttributeName. Does such a thing exist, similar to the way NSForegroundColorAttributeName becomes kCTForegroundColorAttributeName?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岛歌少女 2024-12-01 18:33:22

不,核心文本中不存在这样的属性,您必须在文本下方绘制自己的矩形来模拟它。

基本上,您必须找出要填充字符串中给定范围的矩形。如果您使用生成 CTFrameCTFramesetter 进行布局,则需要使用 CTFrameGetLinesCTFrameGetLineOrigins 获取其线条及其原点

然后迭代这些行并使用 CTLineGetStringRange 找出哪些行属于您要突出显示的范围。要填充矩形,请使用 CTLineGetTypgraphicBounds (对于高度)和 CTLineGetOffsetForStringIndex (对于水平偏移和宽度)。

No, such an attribute doesn't exist in Core Text, you'll have to draw your own rectangles underneath the text to simulate it.

Basically, you'll have to figure out which rectangle(s) to fill for a given range in the string. If you do your layout with a CTFramesetter that produces a CTFrame, you need to get its lines and their origins using CTFrameGetLines and CTFrameGetLineOrigins.

Then iterate over the lines and use CTLineGetStringRange to find out which lines are part of the range you want to highlight. To get the rectangles to fill, use CTLineGetTypographicBounds (for the height) and CTLineGetOffsetForStringIndex (for the horizontal offset and width).

单身狗的梦 2024-12-01 18:33:22

NSBackgroundColorAttributeName 在 iOS 6 中可用,您可以通过以下方式使用它:

[_attributedText addAttribute: NSBackgroundColorAttributeName value:[UIColor yellowColor] range:textRange];

[_attributedText drawInRect:rect]; 

drawInRect: 将支持 NSBackgroundColorAttributeName 以及 iOS 6 支持的所有 NS*AttributeName。

对于 CTFrameDraw() 不支持背景文本颜色。

代码:

- (void)drawRect:(CGRect)rect {    

    // First draw selection / marked text, then draw text

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    [_attributedText drawInRect:rect];

    CGContextRestoreGState(context);

//  CTFrameDraw(_frame, UIGraphicsGetCurrentContext());

}

NSBackgroundColorAttributeName is available in iOS 6, and you can use it by following way:

[_attributedText addAttribute: NSBackgroundColorAttributeName value:[UIColor yellowColor] range:textRange];

[_attributedText drawInRect:rect]; 

drawInRect: will support NSBackgroundColorAttributeName and all NS*AttributeNames supported by iOS 6.

For CTFrameDraw() there is no support for background text color.

Code:

- (void)drawRect:(CGRect)rect {    

    // First draw selection / marked text, then draw text

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    [_attributedText drawInRect:rect];

    CGContextRestoreGState(context);

//  CTFrameDraw(_frame, UIGraphicsGetCurrentContext());

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文