Все мои исследования до сих пор показывают, что это невозможно сделать точно. Вначале мне были доступны только два варианта:
a) Использование диспетчера раскладки для CATextLayer - недоступно в iOS с 4.0
b) Используйте sizeWithFont: constrainedToSize: lineBreakMode: и настройте кадр CATextLayer в соответствии с размером, возвращаемым здесь.
Вариант (б), будучи самым простым подходом, должен работать. В конце концов, это прекрасно работает с UILabels. Но когда я применил один и тот же расчет фрейма к CATextLayer, фрейм всегда оказывался немного больше ожидаемого или необходимого.
Как оказалось, межстрочный интервал в CATextLayers и UILabels (для одного и того же шрифта и размера) различен. В результате sizeWithFont (расчеты межстрочного интервала которого будут соответствовать расчетам UILabels) не возвращает ожидаемый размер для CATextLayers.
Это еще раз подтверждается печатью того же текста с использованием UILabel и CATextLayer и сравнением результатов. Текст в первой строке полностью перекрывается (это тот же шрифт), но межстрочный интервал в CATextLayer чуть короче, чем в UILabel. (Извините, я не могу загрузить скриншот прямо сейчас, так как те, что у меня уже есть, содержат конфиденциальные данные, и в настоящее время у меня нет времени, чтобы сделать пример проекта, чтобы получить чистые скриншоты. Я буду загружать их позже для потомков, когда У меня есть время)
Это странное различие, но я подумал, что можно было бы отрегулировать интервал в CATextLayer, указав соответствующий атрибут для NSAttributedString, которую я там использую, но, похоже, это не так. Изучая CFStringAttributes.h, я не могу найти ни одного атрибута, который мог бы быть связан с межстрочным интервалом.
Bottomline:
Так что кажется, что невозможно использовать CATextLayer на iOS в сценарии, где слой должен соответствовать своему тексту. Я прав в этом или я что-то упускаю?
P.S .:
Причина, по которой я хотел использовать CATextLayer и NSAttributedString, заключается в том, что отображаемая строка должна иметь разные цвета в разных точках. Я думаю, мне просто нужно вернуться к рисованию строк вручную, как всегда ... конечно, всегда есть возможность взломать результаты из sizeWithFont, чтобы получить правильную высоту строки.
Немного злоупотребив тегами 'code', чтобы сделать сообщение более читабельным.
Я не могу пометить сообщение с помощью 'CATextLayer' - на удивление, таких тегов в настоящее время не существует. Если кто-то с достаточной репутацией натолкнется на этот пост, отметьте его соответствующим образом.