2012-04-14 1 views
1

Я работал над пользовательскими чертежами, используя drawRect в подклассах UIView. Это круто, но вам нужно подождать до конца цикла цикла для вызова drawRect, и мне интересно, как вы можете управлять анимацией кадра за кадром, когда вы меняете рисунки с течением времени, или если это возможно? Возможно, Quartz не предназначен для такого типа анимированной графики? Я понимаю, что, возможно, он предназначен для статических рисунков, которые не так часто меняются.Непрерывный рисунок с кварцем? возможна кадр за кадром?

ответ

2

Кварц сам по себе не способен поддерживать высокую частоту кадров, из-за необходимости каждый раз перерисовывать все. Но вы можете заставить Quartz работать вместе с CoreAnimation, чтобы иметь анимацию на основе кварца. Идея заключается в том, что вы можете кэшировать ранее нарисованное содержимое внутри объектов CALayer, а затем использовать CoreAnimation для создания непрерывного эффекта рисования.

Хороший пример этой техники можно найти в AccelerometerGraph sample code provided by Apple. Внутри этого образца подкласс UIView, который использует этот метод, является объектом «GraphView». В основном этот объект рисует как совершенно новую только часть графика (вновь сгенерированные сегменты), поддерживает его в выделенном слое, а затем анимирует слои, чтобы обеспечить анимацию «прокручиваемого графика».

Очевидно, что этот метод работает только тогда, когда вы полностью контролируете элементы чертежа и можете управлять этим инкрементным способом добавления объектов на экран. Конечно, вещи становятся намного более сложными, когда вы должны перерисовывать много разных частей экрана, и вам нужно изменить ранее созданные слои.

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

+0

Это замечательно, спасибо за предложение – johnbakers

1

Ваше приложение должно выйти в цикл выполнения перед каждым фреймом. Сделайте все свои настройки анимации кадров между каждым фреймом. Таким образом, кадр за кадром в drawRect должен работать нормально. Это может работать в приложениях iOS с частотой обновления фрейма 60 Гц, а не только для статических просмотров, если все ваши методы в зависимости от времени кадра, а также от ваших drawRects достаточно быстры. При необходимости отрубите их.

+0

Я думаю, что не понимаю, когда * цикл запуска заканчивается и начинается новый кадр. Где бы я поместил логику анимации кадров? Например, цикл «for» заканчивается в пределах одного цикла запуска? Таким образом, повторные вызовы 'setNeedsDisplay' внутри цикла for не будут работать ... Рисунок будет появляться только после завершения цикла. – johnbakers

+0

@andrewx: вам нужно будет выйти из цикла for и метода, содержащего цикл for, каждый кадр, чтобы позволить циклу выполнения сделать некоторый рисунок. Вы можете вернуться в свою логику цикла в другом последующем вызове метода. Возможно, вам придется сохранить и восстановить какое-то состояние. – hotpaw2

+0

звучит так, как будто мне нужно много узнать об управлении циклами запуска :) – johnbakers