Плавная анимация с использованием drawRect: и UIPanGestureRecognizer

Ok. Я ВИДЕЛ МНОГО тем, которые похожи на то, что я пытаюсь сделать здесь, но ничего, что полностью соответствовало бы. Может быть, мой подход далеко от базы. Вот сделка.

Я рисую диаграмму для своего подкласса UIView в drawRect:. Затем я использую UIPanGestureRecognizer для перевода смещения диаграммы (внутреннего, а не в иерархии представлений) вправо/влево. Это прекрасно работает, но моя проблема в том, что действие распознавателя запускается с относительно низкой частотой. В частности, результирующее панорамирование НАМНОГО более изменчиво, чем, скажем, в прокрутке или табличном представлении. Особенно, когда количество пунктов в моем графике увеличивается. Теперь то, что я хотел бы сделать, это на самом деле не запускать рисование из действия жеста панорамирования, а иметь таймер, срабатывающий примерно 30 раз в секунду, интерполируя смещение с момента срабатывания панорамирования до текущего момента. Однако это становится все более и более сложным.

У кого-нибудь есть предложения? Должен ли я действительно просто делать это с помощью UIScrollView? Причина, по которой я бы предпочел этого не делать, заключается в том, что данные могут распространяться довольно далеко в любом направлении, и я хотел бы не рисовать (или, по крайней мере, сохранять) весь путь сразу, а просто сделать раздел, который в настоящее время отображается. Должен ли я использовать CAShapeLayer? Я хотел бы получить некоторую информацию, прежде чем я потрачу еще один день, играя с этими возможностями...

Любой вклад / опыт будут приветствоваться.


person samson    schedule 28.03.2012    source источник
comment
Почему во время панорамирования вызывается drawRect? Разве вы не просто перемещаете вид?   -  person spring    schedule 28.03.2012
comment
нет, панорама изменяет мое окно данных, что отражается в drawRect. Сам вид не перемещается и не масштабируется.   -  person samson    schedule 29.03.2012
comment
Ах, так это перерисовка для каждого шага прокрутки? Это замедлит ход событий. Один трюк, который я видел, заключается в том, чтобы отображать данные в изображение и перерисовывать данные только при поступлении новых данных, в противном случае просто скомпоновать изображение. Или перенесите представление данных в прокрутку и вообще не перерисовывайте. Опубликуйте свое решение, когда придете к нему.   -  person spring    schedule 29.03.2012
comment
Да, я сейчас пытаюсь встроить его в прокрутку. Проблема в том, что данные могут бесконечно расширяться в любом направлении. Реализация становится все более и более сложной по мере того, как я иду...   -  person samson    schedule 29.03.2012


Ответы (1)


Итак, в конце концов, я ДЕЙСТВИТЕЛЬНО поместил эти вещи в UIScrollView. Мне пришлось проделать довольно много работы, чтобы запустить это, сложной частью было создание серии PANES, которые будут добавлены к прокрутке. Каждая панель запрашивает у делегата данные, необходимые для рисования, а затем все они сшиваются вместе. К счастью, все заработало отлично, как только я поместил эти виды прокрутки, содержащие панели диаграмм, в табличное представление. Еще не занимался масштабированием, но я видел здесь несколько сообщений, которые должны сделать его относительно тривиальным.

Так что это ответ на мой первоначальный вопрос. НЕ ПЫТАЙТЕСЬ панорамировать и рисовать на каждом кадре, он БУДЕТ прерывистым, и я не могу найти хороший способ сгладить его. Представление прокрутки решает все эти проблемы за вас, если вы можете красиво разделить представление. Думаю, я мог бы использовать один длинный просмотр, но когда набор данных становится большим, у меня возникают проблемы.

Теперь у меня есть связанная с этим проблема: когда закадровые диаграммы прокручиваются в поле зрения (они находятся в UITableViewCells), возникает большая икота, когда рисуется новая диаграмма. Я думаю, что я попытаюсь нарисовать их в изображение асинхронно, так что, когда новая строка прокручивается в поле зрения, я уже получил изображение.

person samson    schedule 30.03.2012
comment
Не могли бы вы опубликовать код или объяснить его немного подробнее, пожалуйста? Я делаю почти то же самое, но в настоящее время использую распознаватель жестов панорамирования с CAShapeLayer, из которого я меняю положение и изменяю путь при панорамировании. Не уверен, что это лучшая практика, но работает гладко. Теперь проблема заключается в том, как масштабировать вещь, если найдено новое максимальное значение, поскольку трудно изменить CGMutablePathRef. А дальше много других вопросов. - person Majster; 28.07.2014