J'essaie de sauvegarder et de restaurer un CGContext pour éviter de faire des calculs de dessin lourds pendant une seconde fois et je reçois l'erreur Qu'est-ce que je fais mal? Quelle est la bonne façon de faire cela? P>
3 Réponses :
Ne voulez-vous pas enregistrer d'abord, puis restaurer? Si vous restaurez avant une sauvegarde, il n'y a pas de contexte à restaurer, et vous obtiendriez une sous-fluide.
Voici la façon dont je l'ai utilisée: P>
CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextAddRect(context, originalRect); CGContextClip(context); [self drawInRect:rect]; CGContextRestoreGState(context);
Je pense que vous êtes peut-être mal interpréter ce que de la Documentation sur CGContextsavegState () : P>
Chaque contexte graphique maintient un
pile d'états graphiques. Noter que
Tous les aspects du dessin actuel
environnement sont des éléments de la
état graphique. Par exemple, le
Le chemin actuel n'est pas considéré comme faisant partie de
l'état graphique et est donc
non enregistré lorsque vous appelez le
La pile d'état graphique doit être réinitialisée au début de votre Si tout ce que vous êtes inquiet consiste à mettre en cache votre dessin, cela se fait pour vous par le cgcontextsavegstate () code> et
cgcontextrestoregstate () code> faire. Ils poussent l'état graphique actuel sur une pile et l'apparaissent, vous permettant de transformer l'espace de dessin actuel, de changer de styles de ligne, etc., puis de restaurer l'état à ce qu'il était avant de définir ces valeurs. Il ne stocke pas les éléments de dessin, comme des chemins. p>
CGContextsavegstate () Code> Fonction. P>
blockQuote>
Drawrect: code>, c'est pourquoi vous obtenez des erreurs lorsque vous essayez de faire sauter un état graphique de la pile. Depuis que vous n'aviez pas poussé celui-ci, il n'y avait pas de tomber. Tout cela signifie que vous ne pouvez pas stocker votre dessin comme état graphique sur la pile, puis le restaurer plus tard. P>
Calayer code> qui renvoie votre
uiview code> (sur l'iPhone). Si tout ce que vous faites, c'est bouger votre vue, ce ne sera pas redessiné. Il ne sera tiré que si vous le direz manuellement de le faire. Si vous devez mettre à jour une partie du dessin, je vous recommande de scinder les éléments statiques sur leurs propres vues ou
calayeurs code> afin que seule la partie qui change soit redessinée. P>
.. Basé sur votre code!, Il semble que vous restaurez le contexte avant de l'économiser. Première chose d'abord:
pop code> li>
- règle générale de chaque
Store (poussoir) code> Il doit y avoir restaurer (pop) code> li>
- Relâchez le contexte lorsque vous avez terminé! Cela fait référence à ces contextes / s qu'ils ont
cgCreate code>, cgCopy code>, li>
ol> échantillon code: p> xxx pré> p>