Como localizo o CGRect para uma substring de texto em um UILabel?

Para um dadoNSRangeEu gostaria de encontrar umCGRect em umUILabel que corresponde aos glifos daqueleNSRange. Por exemplo, eu gostaria de encontrar oCGRect que contém a palavra "cachorro" na frase "A rápida raposa marrom pula sobre o cão preguiçoso".

O truque é que oUILabel tem várias linhas, e o texto é realmenteattributedText, então é um pouco difícil encontrar a posição exata da string.

O método que eu gostaria de escrever no meuUILabel subclasse seria algo como isto:

 - (CGRect)rectForSubstringWithRange:(NSRange)range;

Detalhes, para quem estiver interessado:

Meu objetivo com isso é podercrie um novo UILabel com a aparência e a posição exatas do UILabel, que eu posso animar. Eu tenho o resto planejado, mas é esse passo em particular que está me segurando de volta no momento.

O que eu fiz para tentar resolver o problema até agora:

Eu esperava que, com o iOS 7, houvesse um pouco de Kit de Texto que resolveria esse problema, mas a maioria dos exemplos que eu vi com o Text Kit se concentra emUITextView eUITextField, ao invés deUILabel.Eu vi outra pergunta no Stack Overflow que promete resolver o problema, mas a resposta aceita é de mais de dois anos e o código não funciona bem com o texto atribuído.

Eu aposto que a resposta certa para isso envolve um dos seguintes:

Usando um método de Kit de texto padrão para resolver esse problema em uma única linha de código. Eu apostaria que envolveriaNSLayoutManager etextContainerForGlyphAtIndex:effectiveRangeEscrevendo um método complexo que divide o UILabel em linhas e encontra o retângulo de um glifo dentro de uma linha, provavelmente usando os métodos do Texto Principal. Minha melhor aposta atual é desmontar@ mattt excelenteTTTAtributedLabel, que tem um método que encontra um glifo em um ponto - se eu inverter isso e encontrar o ponto para um glifo, isso pode funcionar.

Update: Aqui está um githubista com as três coisas que eu tentei até agora para resolver este problema:https://gist.github.com/bryanjclark/7036101

questionAnswers(9)

yourAnswerToTheQuestion