La ligne est effacée lors de l'élaboration des formes
Question
Je suis en train de faire une demande de dessiner des formes à l'écran en le touchant.
Je peux tracer une ligne d'un point à l'autre-, mais il permet d'effacer sur chaque nouveau tirage.
Voici mon code:
CGPoint location;
CGContextRef context;
CGPoint drawAtPoint;
CGPoint lastPoint;
-(void)awakeFromNib{
//[self addSubview:noteView];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:touch.view];
[self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)];
}
- (void)drawRect:(CGRect)rect {
context = UIGraphicsGetCurrentContext();
[[UIColor blueColor] set];
CGContextSetLineWidth(context,10);
drawAtPoint.x =location.x;
drawAtPoint.y =location.y;
CGContextAddEllipseInRect(context,CGRectMake(drawAtPoint.x, drawAtPoint.y, 2, 2));
CGContextAddLineToPoint(context,lastPoint.x, lastPoint.y);
CGContextStrokePath(context);
lastPoint.x =location.x;
lastPoint.y =location.y;
}
apprécie votre aide -
Nir.
La solution
Comme vous l'avez découvert, -drawRect est l'endroit où vous affichez le contenu d'une vue. Vous ne « voir » à l'écran ce que vous dessinez ici.
Ceci est beaucoup plus bas niveau que quelque chose comme Flash où vous pouvez ajouter un MovieClip contenant une ligne à la scène et un peu de temps plus tard ajouter une autre MovieClip contenant une ligne à la scène et maintenant vous voyez - deux lignes!
Vous devez faire un certain travail et prdobably mettre en place quelque chose comme ..
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:touch.view];
[self addNewLineFrom:lastPoint to:location];
lastPoint = location;
[self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)];
}
- (void)drawRect:(CGRect)rect {
context = UIGraphicsGetCurrentContext();
for( Line *eachLine in lineArray )
[eachLine drawInContext:context];
}
Je pense que vous pouvez voir comment la chair ceci à ce que vous avez besoin.
Une autre façon de procéder est d'utiliser CALayers. En utilisant cette approche vous ne dessiner l'intérieur - - (void) drawRect du tout - vous ajouter et supprimer des couches, dessiner ce que vous aimez l'intérieur d'eux, et la vue gérerez compositing ensemble et dessin à l'écran au besoin. Probablement plus ce que vous cherchez.
Autres conseils
Chaque fois que drawRect
est appelée, vous commencez avec une ardoise vierge. Si vous ne gardez pas trace de tout ce que vous avez dessiné avant afin d'en tirer de nouveau, puis vous finissez par le dessin que le dernier coup de votre doigt, et aucun des anciens. Vous devrez garder une trace de tous vos doigts glisse afin de les redessiner à chaque fois drawRect
est appelé.
Au lieu de redessiner chaque ligne, vous pouvez dessiner dans une image, puis afficher uniquement l'image dans votre méthode drawRect:
. L'image s'accumule les lignes pour vous. Bien sûr, cette méthode rend plus difficile à annuler la mise en œuvre.
De application iPhone Guide de programmation :
Utilisez le UIGraphicsBeginImageContext fonction pour créer une nouvelle base d'images contexte graphique. Après avoir créé cette contexte, vous pouvez dessiner votre image contenu dans, puis utilisez la UIGraphicsGetImageFromCurrentImageContext fonction pour générer une image basée sur ce que vous avez dessiné. (Si vous le souhaitez, vous pouvez même continuer à dessiner et générer images supplémentaires.) Lorsque vous avez terminé la création d'images, utilisez la fonction UIGraphicsEndImageContext à fermer le contexte graphique. Si vous préfèrent utiliser Core Graphics, vous pouvez utiliser la fonction CGBitmapContextCreate créer un contexte graphique bitmap et d'en tirer le contenu de votre image en elle. Lorsque vous avez terminé le dessin, utilisez la fonction CGBitmapContextCreateImage à créer un CGImageRef du bitmap le contexte. Vous pouvez dessiner le noyau image graphique directement ou utiliser ce qu'il initialiser un objet UIImage.