Como localizo o CGRect para uma substring de texto em um UILabel?
Para um dadoNSRange
Eu 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:effectiveRange
Escrevendo 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