3 回答
TA贡献1820条经验 获得超10个赞
遵循约书亚在代码中的回答,我提出了以下似乎很好的方法:
- (CGRect)boundingRectForCharacterRange:(NSRange)range
{
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size];
textContainer.lineFragmentPadding = 0;
[layoutManager addTextContainer:textContainer];
NSRange glyphRange;
// Convert the range for glyphs.
[layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange];
return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
}
TA贡献1856条经验 获得超5个赞
我的建议是利用文本工具包。不幸的是,我们无法UILabel
使用a的布局管理器,但是可以创建它的副本并使用它来获取范围的rect。
我的建议是创建一个NSTextStorage
包含与标签完全相同的属性文本的对象。接下来,创建一个NSLayoutManager
并将其添加到文本存储对象中。最后,创建一个NSTextContainer
与标签大小相同的,然后将其添加到布局管理器中。
现在,文本存储与标签具有相同的文本,文本容器与标签具有相同的大小,因此我们应该能够使用来向我们创建的布局管理器询问我们的范围boundingRectForGlyphRange:inTextContainer:
。确保首先glyphRangeForCharacterRange:actualCharacterRange:
在布局管理器对象上使用,将字符范围转换为字形范围。
一切顺利,应该使您可以确定 CGRect
标签内指定的范围的边界。
我尚未对此进行测试,但这将是我的方法,并且通过模仿UILabel
自身的工作方式,应该有很大的成功机会。
- 3 回答
- 0 关注
- 624 浏览
添加回答
举报