Это абсолютная боль, но это можно сделать.
Вам нужно получить все строки в кадре, используя CTFrameGetLines()
, проверьте, находится ли их диапазон символов в диапазоне, который вы ищете, используяCTLineGetStringRange()
, используйте CTLineGetTypographicBounds()
, чтобы найти, насколько велика будет сама линия, и используйте CTLineGetOffsetForStringIndex()
, чтобы определить фактическую позицию начального / конечного символа диапазона (если линия является лишь поддиапазоном желаемого диапазона).
Комбинируя все это и добавляя смещения и высоты, можно получить то, что вы хотите.Обратите внимание, что CTLineGetImageBounds()
не работает без графического контекста (и, насколько я понимаю, в любом случае это довольно дорого) и не является необходимым для решения этой проблемы.