Я использовал CoreText для этой цели.
Вычисление смещений крана было немного сложным, так как я все время забывал переворачивать систему координат, но в конце концов я понял, и вот краткий обзор того, как выможет сделать это:
- Создайте свой текст как
NSMutableAttributedString
(поскольку вам придется изменить его в какой-то момент). - Сканируйте его, чтобы найти текст, который вы хотите добавить.ссылку на, вставьте два атрибута: 1) цвет текста, например синий;и 2) пользовательский атрибут ссылки (назовите его как угодно, сделайте его значением ссылку, на которую вы хотите перейти)
- Визуализируйте текст в вашем
drawRect:
.Вам нужно будет создать CTFramesetterRef
и CTFrameRef
(последнее, что вы хотите сохранить. Также обратите внимание, что создание framesetter - дорогостоящий процесс, делайте это только один раз (т. Е. Вне drawRect :), есливозможно). - В вашем коде обработки касаний, как я упоминал ранее, вам нужно будет компенсировать различные системы координат.Оттуда, предполагая, что вы знаете, где ваш текст использует его систему координат, вы можете выяснить, где находился текст, отображаемый касанием, которое затем может быть перехвачено вашим сенсорным обработчиком, если атрибут над конкретным
CTRunRef
содержит вашпользовательский атрибут ссылки.Если это так, просто получите атрибут и передайте его чему угодно - как правило, именно здесь вы захотите использовать делегата.
В этом суть.