Пропускает ли блок метода NSAttributedString метода enumerateAttribute диапазоны символов или диапазоны глифов?

tl;dr: если я позвонюNSAttributedString"s enumerateAttribute:inRange:options:usingBlock: метод, делаетrangeаргумент к блоку передать диапазон глифов или диапазон символов?

У меня есть текстовое представление в моем приложении, которое должно вести себя как Notes.app в том смысле, что когда оно не находится в режиме редактирования, оно должно отображать гиперссылки (и они должны быть вставляемыми), и оно должно войти в режим редактирования при нажатии.UITextViewне показывает гиперссылки в редактируемом виде, но если он не редактируемый, он не будет фокусироваться на касании. До iOS 11 это можно было решить с помощью UITapGestureRecognizer в текстовом представлении, чтобы вызвать редактирование, но кажется, что-то (может быть, с помощью перетаскивания?) изменилось, как работают распознаватели жестов UITextView(Rdar://33009324).

Мое новое и улучшенное решение - это обычайUIGestureRecognizerэто срабатывает, если он видит касание, которое не находится на гиперссылке, и делает все другие распознаватели в текстовом представлении требующими его сбоя перед выстрелом. Это реализуется путем обработки касаний, получения их местоположения в текстовом представлении, получения индекса символов для этой точки, перечисления NSLinkAttributeNameв текстовом представленииtextStorageи проверка, перекрывает ли мой индекс персонажа какие-либо гиперссылки, которые я получаю. Если это так, то пользователь нажал на ссылку, и этот распознаватель не работает.

Однако, если индекс символа касания пересекается со ссылкой, мне нужно убедиться, что касание фактически пересекается с прямоугольником ссылки, потому что может быть, что эта ссылка является последней вещью в содержимом текстового представления, а касание фактически ниже последней строки текста. Я могу сделать это, получив прямоугольник для диапазона ссылки и проверив, пересекается ли она с моей точкой касания. я могу использоватьboundingRectForGlyphRange:inTextContainer:для этого, но это приводит к моему вопросу: диапазон, который я имею для ссылки, является диапазоном символов или диапазоном глифа? Нужно ли конвертировать черезglyphRangeForCharacterRange:actualGlyphRange: первый?

2 ответа

Решение

Возвращает диапазон символов. NSAttributedString ничего не знает напрямую о глифах. Преобразование символов в глифы не может произойти до тех пор, пока не будет выполнен макет, и NSAttributedString не включает в себя информацию о макете. Например, NSAttributedString не знает, какова будет область, в которую он будет втянут, и без этого вы не можете знать, где будут разрывы строк, и без этого вы не можете решить, куда помещать лигатуры.

NSAttributedString ничего не знает о глифах, и да, если вам нужно знать, где находятся глифы в стеке TextKit, например, в UITextView, вы попросите менеджера компоновки выполнить преобразование для вас.

Другие вопросы по тегам