Myślę, że możesz źle zrozumieć, co robią CGContextSaveGState()
i CGContextRestoreGState()
. Przesuwają bieżący stan grafiki na stos i wyrzucają go, umożliwiając przekształcenie aktualnej przestrzeni rysunkowej, zmianę stylów linii itp., A następnie przywrócenie stanu do stanu przed ustawieniem tych wartości. Nie przechowuje elementów rysunku, takich jak ścieżki.
Z documentation on CGContextSaveGState():
Każdy kontekst graficzny utrzymuje stos stanów graficznych. Zauważ, że nie wszystkie aspekty bieżącego rysunku są elementami stanu grafiki . Na przykład ścieżka prądu nie jest częścią stanu grafiki i dlatego nie jest zapisywana podczas wywoływania funkcji CGContextSaveGState()
.
Grafiki stan stosu należy zresetować na początku twojej drawRect:
, dlatego dostajesz błędy podczas próby pop stan grafiki ze stosu. Ponieważ nie wepchnąłeś jednego, nie było nikogo, kto by się wyskoczył. Wszystko to oznacza, że nie można zapisać rysunku jako stanu graficznego na stosie, a następnie przywrócić go później.
Jeśli martwisz się tylko o buforowanie rysunku, zrobisz to za pomocą CALayer
, który wykona kopię twojego UIView
(na iPhonie). Jeśli wszystko, co robisz, porusza twój widok, nie zostanie przerysowane. Będzie narysowany tylko wtedy, gdy ręcznie to powiesz. Jeśli musisz zaktualizować część rysunku, zalecam podzielenie elementów statycznych na ich własne widoki lub CALayers
, tak aby przerobić tylko część, która się zmienia.
przepraszam mam edytowane mój kod i znowu się ten sam błąd – cocoatoucher