iPhone CoreText: найти пиксельные координаты подстроки - PullRequest
10 голосов
/ 26 сентября 2010

Вот скриншот приложения Twitter для справки: http://screencast.com/t/YmFmYmI4M

Что я хочу сделать, это поместить всплывающее всплывающее окно поверх подстроки в NSAttributedString, которая может занимать несколько строк. NSAttributedString является требованием для проекта.

На прилагаемом скриншоте видно, что ссылки подсвечены фоном, поэтому я полагаю, что они используют CoreText и NSAttributedStrings. Я также нашел что-то под названием CTRunRef (http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CTRunRef/Reference/reference.html), что выглядит многообещающе, но у меня возникают проблемы с концептуальным согласованием всего этого.

Короче говоря, если у меня есть абзац в основном тексте и когда я нажимаю на слово, как мне найти ограничивающую рамку для этого слова?

Ответы [ 4 ]

8 голосов
/ 26 сентября 2010

Установите какой-либо атрибут в строке атрибута, который не будет влиять на отображение, но заставит его быть размеченным как отдельный прогон глифа, а затем используйте CoreText для разметки строки

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);

Теперь вы будетепридется искать в кадре, чтобы найти соответствующий кусок текста.Получите массив CTLineRef s с CTFrameGetLines().

. Итерируйте по массиву, проверяя, было ли касание в этой строке, проверяя, находится ли он внутри прямоугольника, возвращенного CTLineGetImageBounds().Если это так, то теперь просмотрите глифы в строке.

Опять же, вы можете получить массив CTRunRef s с CTLineGetGlyphRuns().Проверьте, был ли касание в пределах прогона глифа с помощью CTRunGetImageBounds(), и, если это так, вы можете найти диапазон индексов в исходной атрибутивной строке, которому соответствует прогон глифа с CTRunGetStringIndices().

3 голосов
/ 26 ноября 2010

вам нужно найти Y по CTLine и X по ширине и высоте CTRun, которые вы можете получить по словам и самому шрифту.плохо прикрепляю ссылку на мой проект, это действительно простой код, но вы можете изменить его, чтобы удовлетворить ваши потребности.надеюсь, это поможет вам, если вы улучшите общую логику, пожалуйста, дайте мне знать, спасибо. textViewProject

2 голосов
/ 03 августа 2011

Ссылка, предоставленная Джорджем , была очень полезной и дала мне то, что я хотел.Но случилось странное.Он работал в iOS SDK 4.0 , но в iOS SDK 5 положение ссылки отображалось в неправильном положении на виде.

Так что мне пришлось немного подправить код.Для координат x сенсорной кнопки мне пришлось использовать CTRunGetTypographicBounds вместо функции CTRunGetImageBounds .

Итак, в целом, в откорректированном коде: координата y, ширина и высота были вычислены с использованием CTRunGetImageBounds .И координата х была вычислена с использованием CTRunGetTypographicBounds .

0 голосов
/ 25 декабря 2010

Я работал над небольшой библиотекой, которая делает именно это. Вы можете найти его здесь: https://github.com/pothibo/CMFramework

Тем не менее, эта библиотека находится на стадии альфа, необходима оптимизация и отсутствуют некоторые функции (высота строки - одна из неотложных функций, которые я хочу добавить)

Если вы решите использовать его и обнаружите проблему, не стесняйтесь размещать сообщения на github!

...