第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在UILabel中為文本的子字符串找到CGRect?

如何在UILabel中為文本的子字符串找到CGRect?

iOS
慕哥6287543 2019-10-26 12:23:30
對于給定的NSRange,我想找到一個CGRect在UILabel對應的的字形NSRange。例如,我想CGRect在句子“快速的棕色狐貍跳過懶狗”中找到包含“狗”一詞的。訣竅是,它UILabel具有多行,并且文本實際上是attributedText,因此要找到字符串的確切位置有點困難。我想在UILabel子類上編寫的方法如下所示: - (CGRect)rectForSubstringWithRange:(NSRange)range;細節(jié),對于那些感興趣的人:我的目標是能夠創(chuàng)建具有UILabel確切外觀和位置的新UILabel,然后可以對其進行動畫處理。我已經(jīng)弄清了其余的一切,但是尤其是這一步使我此刻退縮。到目前為止,我為解決問題所做的工作:我希望在iOS 7上有一些Text Kit可以解決此問題,但是我在Text Kit上看到的每個示例大多數(shù)都針對UITextView和UITextField,而不是UILabel。我在這里看到了關(guān)于Stack Overflow的另一個問題,該問題有望解決該問題,但是公認的答案已經(jīng)存在了兩年多,并且代碼在歸因于文本的情況下表現(xiàn)不佳。我敢打賭,對此的正確答案涉及以下之一:使用標準的文本工具包方法在一行代碼中解決此問題。我敢打賭這會涉及NSLayoutManager到textContainerForGlyphAtIndex:effectiveRange編寫一個復雜的方法,可以將UILabel分成幾行,并可能使用Core Text方法在一行中找到一個字形的矩形。我目前最好的選擇是分解@mattt出色的TTTAttributedLabel,該方法具有一種在某個點找到字形的方法-如果我將其反轉(zhuǎn),然后找到一個字形的點,則可能會起作用。更新:這是一個github要點,其中包含我迄今為止為解決該問題而嘗試過的三件事:https : //gist.github.com/bryanjclark/7036101
查看完整描述

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];

}


查看完整回答
反對 回復 2019-10-26
?
RISEBY

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自身的工作方式,應該有很大的成功機會。


查看完整回答
反對 回復 2019-10-26
  • 3 回答
  • 0 關(guān)注
  • 653 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號