2010-09-28 14 views
0

Je veux tracer une simple ligne sur l'iPhone en touchant et en faisant glisser à travers l'écran. J'ai réussi à faire cela en sous-classant UIView et en changeant la méthode drawRect: par défaut. En même temps, dans mon viewcontroller, je détecte l'événement tactile et appelle le [myView setNeedsDisplay] si nécessaire. Le problème est que lorsque j'essaie de dessiner la deuxième ligne, la ligne précédente disparaît. Y at-il un moyen de garder la ligne précédente à l'écran?Comment conserver le dessin précédent lors de l'utilisation de Quartz sur l'iPhone?

Toute entrée sera très apprécié.

Répondre

0

Si vous utilisez drawRect: pour dessiner, vous devez dessiner la zone. Vous avez donc besoin de stocker non seulement les données pour la dernière partie mais tout.

Comme alternative, vous pouvez dessiner directement dans un bitmap, ou générer des sous-vues dynamique pour vos lignes (n'a de sens que pour le dessin très limitée (quelques-uns stuff vectoriel).

3

La méthode habituelle consiste à utiliser CGBitmapContextCreate() Créer dans -init/-init-WithFrame:./etc et appelez CGContextRelease() dans -dealloc Je ne sais pas comment vous gérez l'échelle 2x du "écran Retina" avec CGBitmapContextCreate()

..

(UIGraphicsBeginImageContext() est plus facile, mais il pourrait ne pas être sûr de le faire UIGraphicsBeginImageContext(); myContext = CFRetain(UIGraphicsGetCurrentContext()); UIGraphicsEndImageContext();.)

faire quelque chose comme

#import <QuartzCore/CALayer.h> 

-(void)displayLayer:(CALayer*)layer 
{ 
    UIGraphicsPushContext(mycontext); 
    ... Update the bitmap context by drawing a line... 
    UIGraphicsPopContext(); 
    CGImageRef cgImage = CGBitmapContextCreateImage(mycontext); 
    layer.contents = (id)cgImage; 
    CFRelease(cgImage); 
} 

Je l'ai utilisé -displayLayer: (fonction de délégué CALayer; un UIView est son délégué de couche) au lieu de -drawRect: d'efficacité: si vous utilisez -drawRect:, CALayer crée un contexte secondes (et donc une deuxième copie du bitmap).


Alternativement, vous pourriez avoir de la chance avec CGLayer. Je n'ai jamais vu une raison de l'utiliser à la place d'un contexte bitmap; il pourrait être plus efficace dans certains cas.


Alternativement, vous pouvez partir avec la mise en self.clearsContextBeforeDrawing = NO, mais cela est très susceptible de se briser. UIKit (ou, plus exactement, CoreAnimation) vous attend à tirer la vue entière contenue dans le clip rect (c'est l'argument « rect » de -drawRect:, ce n'est pas garanti les limites). Si votre vue disparaît, CoreAnimation peut décider de récupérer la mémoire. Ou CoreAnimation peut uniquement dessiner la partie de la vue affichée à l'écran. Ou CoreAnimation peut effectuer un dessin à double tampon, ce qui fait que votre vue semble basculer entre deux états.