2013-12-01 2 views
2

У меня есть NSLayoutManager, который рисует текст, используя следующий код:Animate NSLayoutManager рисунок

[[self textLayoutManager] drawGlyphsForGlyphRange: NSMakeRange(0, [[self text] length]) 
              atPoint: textFrame.origin];  

на мой взгляд-х -drawRect:. Это работает чудесно, но то, что я действительно хотел бы сделать, - это оживить текст, характер по характеру, как если бы он набирался.

Я попытался добавить символы в переменную «видимая строка», а затем позвонить -[self setNeedsDisplay], но при работе с текстом примерно на 20 символов он начинает отставать, так как он каждый раз перерисовывает весь текст.

Регрессия: Как я могу анимировать NSLayoutManager's -drawGlyphsForGlyphRange:atPoint:?

ответ

1

(Отказ от ответственности:. У меня нет ужасного большого опыта работы с новым API-интерфейсами, так что это, в основном, исходя из предыдущего опыта работы с текстом рендерингом)

Вашего серьезный спад будет исходить от полного на изменение текста, с которым работает менеджер компоновки. Даже если вы просто добавляете текст, замена текста, который он использует, заставит его выкидывать все вычисления компоновки - интервалы, необходимые глифы, фактически считывать эти глифы в ОЗУ, применять атрибуты и т. Д. - и начинать с того, что получает очень дорогое очень быстро. Что касается фактического NSLayoutManager, это «аннулирование макета».

Я вижу пару потенциальных решений с верхней части головы. Вы можете подкласса NSLayoutManager («Вы можете создать подкласс NSLayoutManager для обработки дополнительных текстовых атрибутов, независимо от того, являются ли они неотъемлемыми или нет.) И переопределить showCGGlyphs:positions:count:font:matrix:attributes:inContext:, чтобы постепенно игнорировать определенные глифы (тем самым оставляя исходный текст без использования). Другим подходом было бы эмулировать то, что происходит, когда вы вводите текст в собственный контейнер - используйте изменяемое текстовое хранилище и добавляете желаемый текстовый символ по-символу, так что вычисление текста выполняется итеративно.

Если те, кто по-прежнему не имеют большой производительности, рассмотрите возможность использования этих методов в тандеме с некоторыми собственными текстовыми представлениями; хотя это сейчас менее верно, чем в предыдущих SDK, нередактируемый UITextView или UILabel (для изменяемого и неизменяемого текста, соответственно) содержат гораздо больше оптимизаций, чем могли бы понять наши простые смертные умы.

Смежные вопросы