Альтернатива для sizeWithFont: метод - PullRequest
3 голосов
/ 03 марта 2010

У меня есть класс, работа которого заключается в разборе текста на несколько страниц. Я использую sizeWithFont: метод, чтобы определить, когда одна страница заканчивается, а другая начинается. Но, к сожалению, поскольку объем текста, который необходимо проанализировать, довольно велик, вся операция должна выполняться в фоновом потоке (для завершения требуется несколько секунд). И поэтому иногда я получаю визуальные артефакты на своем интерфейсе (UIKit не является потокобезопасным, но я вызываю его из нескольких потоков одновременно), от которого я бы хотел избавиться.

Мне нужно избавиться от использования sizeWithFont: в фоновом потоке. Но, похоже, альтернативы этому методу просто не существует. Единственный способ узнать ширину текста с помощью Core Graphics - это использовать метод, указанный в документации Apple:

  1. Вызовите функцию CGContextGetTextPosition, чтобы получить текущую текстовую позицию.
  2. Установите режим рисования текста на kCGTextInvisible, используя функцию CGContextSetTextDrawingMode.
  3. Нарисуйте текст, вызвав функцию CGContextShowText, чтобы нарисовать текст в текущей позиции текста.
  4. Определите окончательную позицию текста, вызвав функцию CGContextGetTextPosition.
  5. Вычтите начальную позицию из конечной позиции, чтобы определить ширину текста.

Но я действительно обеспокоен тем, что это приведет к огромной потере производительности.

Кто-нибудь знает другой способ узнать ширину текста?

1 Ответ

1 голос
/ 12 мая 2010

Если у вас есть возможность настроить свое приложение для iPhone OS 3.2, вы можете взглянуть на Базовый текст .

Хотя, обратите внимание, что вся библиотека Core Text также не является полностью поточно-ориентированной. Из документации:

Многоядерные соображения: Все отдельные функции в Core Text являются поточно-ориентированными. Объекты шрифта (CTFont, CTFontDescriptor и связанные объекты) могут использоваться одновременно несколькими операциями, рабочими очередями или потоками. Однако объекты макета (CTTypesetter, CTFramesetter, CTRun, CTLine, CTFrame и связанные объекты) должны использоваться в одной операции, рабочей очереди или потоке.

...