La sauvegarde et la restauration CGContext
Je suis en train de sauvegarder et de restaurer une CGContext pour éviter de faire de lourds dessin calculs pour une deuxième fois et j'obtiens le message d'erreur <Error>: CGGStackRestore: gstack underflow
.
Ce que je fais mal? Quelle est la bonne façon de le faire?
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
if (initialized) {
CGContextRestoreGState(context);
//scale context
return;
}
initialized = YES;
//heavy drawing computation and drawing
CGContextSaveGState(context);
}
OriginalL'auteur cocoatoucher | 2009-09-18
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pourriez être mal interprété ce
CGContextSaveGState()
etCGContextRestoreGState()
faire. Ils pousser le courant de l'état graphique sur une pile et de la pop off, vous permettant de transformer le cours de dessin de l'espace, changer les styles de ligne, etc., ensuite restaurer l'état de ce qu'il était avant de définir ces valeurs. Il ne stocke pas les éléments de dessin comme des chemins.De la documentation sur CGContextSaveGState():
Le graphique de l'état de la pile doit être réinitialisé au début de votre
drawRect:
, qui est pourquoi vous recevez des erreurs lorsque vous essayez de pop graphique de l'état de la pile. Depuis que tu n'avais pas poussé un, il n'y avait rien à pop off. Tout cela signifie que vous ne pouvez pas garder votre dessin comme de l'état graphique sur la pile, puis la restaurer plus tard.Si vous êtes inquiète, c'est la mise en cache de votre dessin, qui est fait pour vous par le
CALayer
qui sauvegarde votreUIView
(sur l'iPhone). Si tout ce que vous faire est de déplacer votre point de vue, il ne sera pas redessiné. Il ne sera établi si vous avez manuellement le dire pour le faire. Si vous ne devez mettre à jour la partie du dessin, je recommande le fractionnement de la statique des éléments de leur propre point de vue ouCALayers
de sorte que seule la partie qui change, c'est redessiné.OriginalL'auteur Brad Larson
Vous ne souhaitez pas Enregistrer d'abord, puis le Restaurer? Si vous souhaitez restaurer avant de l'enregistrer, il n'y a aucun contexte pour la restauration, et vous obtenez un dépassement de capacité.
Ici est la façon dont je l'ai utilisé:
ou:
Peut-être que vous essayez de faire quelque chose d'autre.
OriginalL'auteur mahboudz
.. En fonction de votre code !,
Il semble que vous restaurez le Contexte avant de l'enregistrer.
La Première Chose D'Abord:
Pop
Store(push)
il doit y avoirRestore(pop)
CGCreate
,CGCopy
,Exemple de code:
OriginalL'auteur abdimuna