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 пикселей и содержит больше слов, чем должно быть.
Извините за длинное описание, вот мои вопросы:
- может быть, использовать каркас CT для измерения простой строки - пустая трата времени, так есть ли способ сделать -sizeWithFont безопасным для использования в фоновом режиме?
- если поведение
CTFramesetterSuggestFrameSizeWithConstraints()
это дизайн, есть ли способ заставить функцию CT строго подчиняться моему ограничению? Если нет, как я могу измерить строки с фиксированной шириной, а режим переноса строки - это перенос слов?
1 ответ
Используйте CTFramesetterSuggestFrameSizeWithConstraints(), и, прежде чем возвращать размер результата, попробуйте установить для параметра result.width значение ширины от размера ограничений.