Для данного NSRange
я хотел бы найти CGRect
в UILabel
, который соответствует глифам этого NSRange
. Например, я хотел бы найти CGRect
, который содержит слово "собака" в предложении "Быстрая коричневая лиса прыгает через ленивую собаку".
Трюк состоит в том, что UILabel
имеет несколько строк, а текст действительно attributedText
, поэтому немного сложно найти точное положение строки.
Метод, который я хотел бы написать в моем подклассе UILabel
, выглядел бы примерно так:
- (CGRect)rectForSubstringWithRange:(NSRange)range;
Подробности для тех, кто заинтересован:
Моя цель состоит в том, чтобы создать новый UILabel с точным внешним видом и позицией UILabel, который я смогу затем оживить. Я все понял, но это, в частности, этот шаг, который удерживает меня в данный момент.
Что я сделал, чтобы решить проблему до сих пор:
- Я надеялся, что с iOS 7 будет немного текстового набора, который бы разрешил эту проблему, но в большинстве случаев, которые я видел с помощью Text Kit, основное внимание уделяется
UITextView
иUITextField
, а неUILabel
. - Я видел еще один вопрос о переполнении стека здесь, чтобы promises решить проблему, но принятый ответ более двух лет, и код не работает хорошо с атрибутом текста.
Готов поспорить, что правильный ответ на это включает в себя одно из следующего:
- Использование стандартного метода Text Kit для решения этой проблемы в одной строке кода. Я бы поспорил, что он будет включать
NSLayoutManager
иtextContainerForGlyphAtIndex:effectiveRange
- Написание сложного метода, который разбивает UILabel на строки и находит прямой глифа внутри строки, вероятно, используя методы Core Text. Моя лучшая ставка заключается в том, чтобы отделить @mattt's отличный TTTAttributedLabel, который метод, который находит глиф в точке - если я инвертирую это и найду точку для глифа, которая может работать.
Обновление: здесь github gist с тремя вещами, которые я до сих пор пытался решить эту проблему: https://gist.github.com/bryanjclark/7036101