CTFramesetterSuggestFrameSizeWithConstraints возвращает ширину за пределы ограничения?

В моем приложении мне нужно динамически изменять размер представления в соответствии с его текстовым содержимым. Сначала я использую -sizeWithFont сделать измерение строки. В моем приложении есть много измерений, поэтому я положил -sizeWithFont в фоновом режиме, поскольку документация Apple гласит: "В iOS 10.4 и более поздних версиях вы можете использовать методы, описанные в этом расширении класса, из вторичных потоков в вашем приложении, а не только из основного потока". Однако правда в том, что этот метод вызовет некоторую функцию WebCore, которая не является поточно-ориентированной, поэтому приложение будет аварийно завершать работу. Эта ошибка уже была зарегистрирована, но все еще не исправлена. (некоторые вопросы об этом, например, sizeWithFont в MultiThread Crash!)

Поскольку из-за производительности я не могу поместить измерение в основной поток, я пытаюсь использовать инфраструктуру CoreText. Я сначала создаю соответствующий NSAttributedString для моей строки, затем используйте некоторую функцию CT, чтобы сделать измерение. Я знаю, что в iOS 6 есть очень простой API, такой как -size могу сделать эту работу, но я не могу использовать их из-за совместимости. Поэтому я должен вызвать некоторую низкоуровневую функцию, такую ​​как CTFramesetterSuggestFrameSizeWithConstraints() или же CTFramesetterCreateFrame(), но я обнаружил, что эти методы КТ иногда не уважали мое ограничение. Например, если я установлю CGSize(200, CGFLOAT_MAX) для CTFramesetterSuggestFrameSizeWithConstraints() , что должно означать, что есть ограничение в ширине, но на самом деле он вернет некоторый размер, который имеет большую ширину, например 205. То же самое происходит с CTFramesetterCreateFrame(), Если я позвоню, а затем позвоните CTFrameGetLines() Иногда я получаю количество строк меньше, чем должно быть, потому что ширина какой-то строки превышает 200 пикселей и содержит больше слов, чем должно быть.

Извините за длинное описание, вот мои вопросы:

  1. может быть, использовать каркас CT для измерения простой строки - пустая трата времени, так есть ли способ сделать -sizeWithFont безопасным для использования в фоновом режиме?
  2. если поведение CTFramesetterSuggestFrameSizeWithConstraints() это дизайн, есть ли способ заставить функцию CT строго подчиняться моему ограничению? Если нет, как я могу измерить строки с фиксированной шириной, а режим переноса строки - это перенос слов?

1 ответ

Используйте CTFramesetterSuggestFrameSizeWithConstraints(), и, прежде чем возвращать размер результата, попробуйте установить для параметра result.width значение ширины от размера ограничений.

Другие вопросы по тегам