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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top