Все мои исследования пока показывают, что это невозможно сделать точно. Единственные два варианта, доступные мне вначале:
a) Использование менеджера макетов для CATextLayer - недоступно в iOS с 4.0
b) Используйте sizeWithFont: constrainedToSize: lineBreakMode: и отрегулируйте кадр CATextLayer в соответствии с размером, указанным здесь.
Вариант (b), являющийся простейшим подходом, должен работать. В конце концов, он отлично работает с 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" - удивительно, что на данный момент таких тегов нет. Если кто-то с достаточной репутацией сталкивается с этим сообщением, пожалуйста, отметьте его соответствующим образом.