Поскольку ни один из ваших вопросов не содержит достаточно подробностей сам по себе, я собираюсь сделать что-то неправильное и опубликовать мета-ответ для вашего текущего последнего пять вопросов .
Сначала втяните drawRect:
и больше нигде.
Это так важно, что яЯ скажу это снова.
Ничья в drawRect:
и больше нигде.
Не touchesMoved:withEvent:
.
Не touchesBegan:
или Ended:
.
drawRect:
и больше нигде.
Если вы создаете изображение для сохранения в файл , это одно.Но когда вы рисуете на экран, вы не делаете это нигде, кроме drawRect:
.
Серьезно.Это так важно.
Шаг 2: Не пытайтесь заставить рисование произойти в любое другое время.
drawRect:
призван для вас когда пришло время рисовать.По определению, в любое другое время вам не нужно рисовать, поэтому рисование делает то, что вам не нужно.По номеру не звоните drawRect:
сами .Вам это не нужно, и это никогда не помогает.
На самом деле, это всего лишь расширение шага 1. Если вы звоните drawRect:
, это ничем не отличается от того, что у вас был код рисования, по которому у вас был вызов.Код рисования не повторяется повсеместно, что хорошо, но он все еще выполняется в неподходящее время. Пусть drawRect:
вызывается только тогда, когда система вызывает его.
setNeedsDisplay
существует, чтобы сообщить системе, что пришло время рисовать.Вы должны сделать это, когда, и только , когда что-то изменилось, что вам нужно будет нарисовать.Свойства вашего представления, что-то в модели - всякий раз, когда что вы будете вносить изменения, отправляйте себе setNeedsDisplay
Не делай этого в любое другое время;Вам не нужно.
Выключите таймер.Тебе это не нужно.В любом случае, там уже есть таймер, ограничивающий вас до 60 кадров в секунду.
Core Graphics не отстает.Нет, правда, это не так.Замедление или «отставание» объясняется тем, что либо вы пытаетесь сделать слишком много, либо делаете что-то не так.
Не кешируйте без необходимости.Ничто из того, что вы делаете, не требует кеша изображений.
«Задержка» заключается в том, что вы пытаетесь рисовать или форсировать рисование с touchesMoved:withEvent:
и / или touchesBegan:
/ Ended:
.См. Выше.
Вот что вам нужно сделать:
В ваших touchesBegan:
/ Moved:
/ Ended:
методах или других соответствующих методах респондента обновите ваше состояние,Это будет включать путь Безье. Не рисовать , включая , не вызывать drawRect:
или иным образом пытаться вызвать рисование.
После того, как вы обновили свое состояние, и только если выСделав это, отправьте себе setNeedsDisplay
.
в своем методе drawRect:
и только в своем методе drawRect:
, нарисуйте путь, градиент, что угодно, как вы видитеfit.
Делайте эти вещи, и ваше приложение будет быстрым.С основной графикой.Без задержки.
Также, некоторые важные чтения: