Извините, но я не думаю, что это отвечает на вопрос. Вопрос в том, чтобы изменить размер CATextLayer по вертикали, чтобы обернуть / подогнать любую строку, в то время как ответ заключается в вертикальном выравнивании - это тоже одна строка - текста.

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

а) Использование диспетчера раскладки для CATextLayer - недоступно на iOS с 4.0

б) Используйте sizeWithFont: constrainedToSize: lineBreakMode: и настройте кадр CATextLayer в соответствии с размером, возвращаемым здесь.

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

Как оказалось, межстрочный интервал в CATextLayers и UILabels (для одинакового шрифта и размера) различен. В результате sizeWithFont (расчеты межстрочного интервала которого будут совпадать с UILabels) не возвращает ожидаемый размер для CATextLayers.

Это дополнительно подтверждается печатью того же текста с использованием UILabel, что и CATextLayer, и сравнением результатов. Текст в первой строке полностью перекрывается (это тот же шрифт), но межстрочный интервал в CATextLayer чуть короче, чем в UILabel. (Извините, я не могу загрузить скриншот прямо сейчас, так как те, что у меня уже есть, содержат конфиденциальные данные, и в настоящее время у меня нет времени, чтобы сделать пример проекта, чтобы получить чистые скриншоты. Я буду загружать их позже для потомков, когда У меня есть время)

Это странное различие, но я подумал, что можно было бы отрегулировать интервал в CATextLayer, указав соответствующий атрибут для NSAttributedString, которую я там использую, но, похоже, это не так. Глядя на CFStringAttributes.h, я не могу найти ни одного атрибута, который мог бы быть связан с межстрочным интервалом.

Нижняя линия:

Так что кажется, что невозможно использовать CATextLayer на iOS в сценарии, где слой должен соответствовать его тексту. Я прав в этом или я что-то упустил?

P.S:

Причина, по которой я хотел использовать CATextLayer и NSAttributedString, заключается в том, что отображаемая строка должна иметь разные цвета в разных точках. Я думаю, мне просто нужно вернуться к рисованию строк вручную, как всегда ... конечно, всегда есть возможность взломать результаты из sizeWithFont, чтобы получить правильную высоту строки.

Немного злоупотребив тегами code, чтобы сделать пост более читабельным.

Я не могу пометить сообщение с помощью 'CATextLayer' - на удивление, таких тегов в настоящее время не существует. Если кто-то с достаточной репутацией натолкнется на этот пост, отметьте его соответствующим образом.

Ответы на вопрос(3)

Ваш ответ на вопрос