3 回答

TA貢獻1820條經(jīng)驗 獲得超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條經(jīng)驗 獲得超5個贊
我的建議是利用文本工具包。不幸的是,我們無法UILabel
使用a的布局管理器,但是可以創(chuàng)建它的副本并使用它來獲取范圍的rect。
我的建議是創(chuàng)建一個NSTextStorage
包含與標簽完全相同的屬性文本的對象。接下來,創(chuàng)建一個NSLayoutManager
并將其添加到文本存儲對象中。最后,創(chuàng)建一個NSTextContainer
與標簽大小相同的,然后將其添加到布局管理器中。
現(xiàn)在,文本存儲與標簽具有相同的文本,文本容器與標簽具有相同的大小,因此我們應該能夠使用來向我們創(chuàng)建的布局管理器詢問我們的范圍boundingRectForGlyphRange:inTextContainer:
。確保首先glyphRangeForCharacterRange:actualCharacterRange:
在布局管理器對象上使用,將字符范圍轉(zhuǎn)換為字形范圍。
一切順利,應該使您可以確定 CGRect
標簽內(nèi)指定的范圍的邊界。
我尚未對此進行測試,但這將是我的方法,并且通過模仿UILabel
自身的工作方式,應該有很大的成功機會。
- 3 回答
- 0 關(guān)注
- 653 瀏覽
添加回答
舉報