Я думаю, вы, возможно, неправильно истолковываете, что делают CGContextSaveGState()
и CGContextRestoreGState()
. Они помещают текущее графическое состояние в стек и извлекают его, позволяя вам преобразовать текущее пространство рисования, изменить стили линий и т. Д., А затем восстановить состояние до того, каким оно было до установки этих значений. Он не хранит элементы чертежа, такие как контуры.
Из документации по CGContextSaveGState () :
Каждый графический контекст поддерживает
стек графических состояний. Обратите внимание, что
не все аспекты текущего рисунка
окружающая среда являются элементами
графическое состояние. Например,
текущий путь не считается частью
графическое состояние и, следовательно,
не сохраняется при вызове
CGContextSaveGState()
функция.
Стек графического состояния должен быть сброшен в начале вашего drawRect:
, поэтому вы получаете ошибки, когда пытаетесь вытолкнуть графическое состояние из стека. Так как ты не нажал одну, не было ничего, чтобы выскочить. Все это означает, что вы не можете сохранить чертеж в виде графического состояния в стеке, а затем восстановить его.
Если все, что вас беспокоит, это кэширование вашего рисунка, то это делается для вас CALayer
, который поддерживает ваш UIView
(на iPhone). Если все, что вы делаете, это перемещает ваш взгляд, он не будет перерисован. Он будет нарисован, только если вы вручную скажете это сделать. Если вам необходимо обновить часть чертежа, я рекомендую разбить статические элементы на их собственные виды или CALayers
, чтобы перерисовывалась только изменяемая часть.