Partage
  • Partager sur Facebook
  • Partager sur Twitter

[XCode IOS] Application pour dessiner

Sujet résolu
    20 mars 2013 à 15:44:30

    Bonjour à tous !

    Voilà mon projet : je cherche à créer une application ou l'utilisateur pourrait dessiner à l'aide de son écran (type Draw something pour ceux qui connaisent).

    Mon problème est le suivant : je n'arrive pas à comprendre comment faire pour que lorsque l'utilisateur trace une ligne avec son doigt, elle apparaisse à l'écran. Je ne sais pas si un objet existe déjà, si oui est-ce que vous pourriez me donner son nom, sinon est-ce que vous avez une piste pour me guider ?
    J'ai déjà compris le principe du "swipe gesture recognize", j'arrive à faire interragir l'utilisateur avec des vues. En revanche je n'ai pas non plus compris le principe du delegate. Enfin si le principe, oui mais pas comment l'utiliser.

    En espérant qu'un post n'existe pas déjà (je suis remonté jusqu'en janvier mais après j'en ai un peu eu marre :p ) !

    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2013 à 17:45:07

      Salut,

      Jette un oeil sur ce lien http://www.ifans.com/forums/threads/tutorial-drawing-to-the-screen.132024/ la marche à suivre basique y est expliquée
      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2013 à 21:09:04

        Merci pour ton message ! Ca m'a bien aidé, j'ai réussir à obtenir un ViewController sur lequel je peut dessiner.

        Mais j'ai un nouveau soucis : j'essaie de le mettre sur la View étant dedans seulement...

        Je m'explique : j'aimerais une partie seulement ou l'on peut écrire. Du coup il faudrait que j'applique les méthode touchesEnded, touchesBegan et touchesMoved à la View mais le problème c'est que la plupart des méthodes utilisés ne sont pas existantes dans une vue simple ....

        Je continue mes recherches dans les alentours du site ;)

        En tout cas merci, ça m'a déjà bien avancé.
        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2013 à 17:09:57

          Petit up pour dire que j'ai réussi à mettre le dessin dans la view.

          En revanche maintenant je ne peux faire qu'un seul trait ... Dés que je recommence un trait ça m'efface l'ancien. Du coup, je cherche soit un moyen de ne pas réinitialiser ma view, soit un moyen de la sauvegarder ...

          Edit : J'ai réussi à trouver un moyen pour faire en sorte que ça ne se réinitialise pas : [self setNeedsDisplay:YES]. Mais cela ne fonctionne pas ... Il me dit que le selecteur n'est pas déclarer .... La plupart des recherches google que j'ai faite m'ont donné comme résolution qu'il fallait que j'ai ma view qui soit est/soit une subclasse enfin qu'il y est dans mon .h :" @interface Dessin : UIView". Or j'ai cette ligne, donc le problème ne viens pas de là ...

          En fait, le "YES" pose problème : si je met  [self setNeedsDisplay], ça run mais ça ne sert à rien ....

          -
          Edité par ptytomtok 21 mars 2013 à 19:51:44

          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2013 à 21:04:55

            ptytomtok a écrit:

            Petit up pour dire que j'ai réussi à mettre le dessin dans la view.

            En revanche maintenant je ne peux faire qu'un seul trait ... Dés que je recommence un trait ça m'efface l'ancien. Du coup, je cherche soit un moyen de ne pas réinitialiser ma view, soit un moyen de la sauvegarder ...


            C'est une view ton trait? Ou qu'est-ce que c'est comme objet? J'ai pas lu le lien mais si tu dis que ça s'efface c'est certainement que c'est une vue que tu redéfinis à chaque fois, si c'est le cas alors tu devrais faire plusieurs view. Si c'est un objet type UIImage devrait pas y avoir de soucis en théorie :/
            • Partager sur Facebook
            • Partager sur Twitter
              21 mars 2013 à 22:05:20

              Non non ce n'est pas une view.

              Il s'agit d'un trait tracé à l'aide de drawRect (donc une suite de rectangle (d'ailleurs si quelqu'un sait comment avoir des rond plutôt ^^) les uns à la suite des autres qui forme une ligne comme si tu dessiné). Mais dés que je tente de faire une deuxième ligne, la première s'efface. Comme si tu dessinais avec un crayon sans jamais pouvoir lever le crayon en soit.

              - (void) drawRect:(CGRect)rect
              {
              	CGContextRef context = UIGraphicsGetCurrentContext();
              	CGContextSetLineWidth(context, 20.0);
              	CGContextSetLineCap(context, kCGLineCapRound);
              	CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1);	//Couleur du trait pour les 3 premiers paramètre, opacité pour le quatrième
              	PointLocation *tempPoint;
              	CGContextBeginPath(context);
              	for(int i=0;i<[pointArray count];i++)
              	{
              		tempPoint = [pointArray objectAtIndex:i];
              		if(i==0)
              		{
              			CGContextMoveToPoint(context, tempPoint.location.x, tempPoint.location.y);
              			continue;
              		}
              		CGContextAddLineToPoint(context, tempPoint.location.x, tempPoint.location.y);
              	}
              	CGContextStrokePath(context);
              	CGContextDrawPath(context, kCGPathStroke);
              }

              Voila mon code concernant le DrawRect. Donc si j'ai bien compris (après quelques recherches supplémentaires :p ), quand je fais [self setNeedsDisplay] c'est DrawRect qui est appelé ?

              Du coup, à chaque fois que je l'appelle ça rajoute un rectangle. Donc je l'appelle dans les méthodes : touchesBegan, touchesMoved et touchesEnded. Mais j'aimerais le garder en mémoire du coup, pour qu'il réapparaisse lors du deuxième touches Began.

              Je ne sais pas si j'ai été très clair. Si c'est encore obscure, je mettrais mon code au complet ;) 

              Edit : je rajoute mes méthodes touches :

              - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
              {
              	self.pointArray = [[NSMutableArray alloc]init];
              	UITouch *touch = [touches anyObject];
              	PointLocation *currentLoc = [[PointLocation alloc]init];
              	currentLoc.location = [touch locationInView:self];
              	[pointArray addObject:currentLoc];
              }
              
              - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
              {
              	UITouch *touch = [touches anyObject];
              	PointLocation *currentLoc = [[PointLocation alloc]init];
              	currentLoc.location = [touch locationInView:self];
              	[pointArray addObject:currentLoc];
              	[self setNeedsDisplay];
              }
              
              
              
              - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
              {
              	UITouch *touch = [touches anyObject];
              	CGPoint currentPoint = [touch locationInView:self];
              	currentPoint.y -= 10;
              	PointLocation *currentLoc = [[PointLocation alloc]init];
              	currentLoc.location = [touch locationInView:self];
              	[pointArray addObject:currentLoc];
              	[self setNeedsDisplay];
              }



              -
              Edité par ptytomtok 21 mars 2013 à 22:28:09

              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2013 à 10:40:52 - Message modéré pour le motif suivant : Message complètement hors sujet


                  22 mars 2013 à 17:13:28

                  Il  n'est jamais appelé ton [self drawRect] dans ce code, si?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mars 2013 à 19:12:31

                    En fait, il est appelé lors de [self setNeedsDisplay]. Mais du coup, ça supprime l'ancien dessin à chaque fois.
                    Si j'essaie d'appeler directement drawRect, il faut que je lui passe un paramètre et ça me donne des erreurs ... (invalid context).

                    Je suis maintenant à la recherche d'une fonction identique à setNeedsDisplay mais sans le rafraichissement en gros. 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mars 2013 à 19:28:05

                      Tu t'es organisé bizarrement je trouve, voilà comment j'aurais procédé :

                      -On récupère les données de pression sur l'écran

                      -On en fait un rectangle directement dans les fonctions touchesMoved et touchesEnded

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 mars 2013 à 21:27:48

                        Bon, ça a avancé !

                        J'ai enfin réussi à obtenir ce que je voulais ! Je met le code pour ceux qui veulent ^^

                        DessinView.m

                        #import "DessinView.h"
                        #import "PointLocation.h"
                        #import <QuartzCore/QuartzCore.h>
                        
                        @implementation DessinView
                        
                        @synthesize pointArray;
                        
                        - (id)initWithFrame:(CGRect)frame
                        {
                            self = [super initWithFrame:frame];
                            if (self) {
                                // Initialization code
                            }
                            return self;
                        }
                        
                        - (void) viewDidLoad
                        {
                        	
                        }
                        
                        - (void) drawRect:(CGRect)rect
                        {
                        	CGContextRef context = UIGraphicsGetCurrentContext();
                        	//CGContextSetLineWidth(context, 20.0);
                        	//CGContextSetLineCap(context, kCGLineCapRound);
                        	//CGContextFillEllipseInRect(UIGraphicsGetCurrentContext(), CGRectMake(10, 10, 10, 10));
                        	PointLocation *tempPoint;
                        	//CGContextBeginPath(context);
                        	for(int i=0;i<[pointArray count];i++)
                        	{
                        		tempPoint = [pointArray objectAtIndex:i];
                        		if(i==0)
                        		{
                        			CGContextMoveToPoint(context, tempPoint.location.x, tempPoint.location.y);
                        			continue;
                        		}
                        		CGContextAddLineToPoint(context, tempPoint.location.x, tempPoint.location.y);
                        	}
                        	//CGContextStrokePath(context);
                        	//CGContextDrawPath(context, kCGPathStroke);
                        }
                        
                        - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
                        {
                        	CGRect r = CGRectMake(10, 10, 10, 10);
                        	UIView *subview = [[UIView alloc] initWithFrame:r];
                        	subview.backgroundColor = [UIColor redColor];
                        	subview.layer.cornerRadius = 5;
                        	
                        	self.pointArray = [[NSMutableArray alloc]init];
                        	UITouch *touch = [touches anyObject];
                        	PointLocation *currentLoc = [[PointLocation alloc]init];
                        	currentLoc.location = [touch locationInView:self];
                        	subview.center = currentLoc.location;
                        	[self addSubview:subview];
                        	[pointArray addObject:currentLoc];
                        	[self setNeedsDisplay];
                        }
                        
                        /*- (void)drawRect:()rect
                        {
                        	CGContextRef context = UIGraphicsGetCurrentContext();
                        	CGColorRef red = [[UIColor redColor] CGColor];
                        	
                        	CGContextSetFillColorWithColor(context, red);
                        	CGContextFillRect(context, CGRectMake(10, 10, 100, 100));
                        }*/
                        
                        - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
                        {
                        	
                        }
                        
                        - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
                        {
                        	CGRect r = CGRectMake(10, 10, 10, 10);
                        	UIView *subview = [[UIView alloc] initWithFrame:r];
                        	subview.backgroundColor = [UIColor redColor];
                        	subview.layer.cornerRadius = 5;
                        	
                        	self.pointArray = [[NSMutableArray alloc]init];
                        	UITouch *touch = [touches anyObject];
                        	PointLocation *currentLoc = [[PointLocation alloc]init];
                        	currentLoc.location = [touch locationInView:self];
                        	subview.center = currentLoc.location;
                        	[self addSubview:subview];
                        	[pointArray addObject:currentLoc];
                        }
                        
                        - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
                        {
                        	CGRect r = CGRectMake(10, 10, 10, 10);
                        	UIView *subview = [[UIView alloc] initWithFrame:r];
                        	subview.backgroundColor = [UIColor redColor];
                        	subview.layer.cornerRadius = 5;
                        	
                        	self.pointArray = [[NSMutableArray alloc]init];
                        	UITouch *touch = [touches anyObject];
                        	PointLocation *currentLoc = [[PointLocation alloc]init];
                        	currentLoc.location = [touch locationInView:self];
                        	subview.center = currentLoc.location;
                        	[self addSubview:subview];
                        	[pointArray addObject:currentLoc];
                        }
                        
                        
                        // Only override drawRect: if you perform custom drawing.
                        // An empty implementation adversely affects performance during animation.
                        
                        
                        
                        @end
                        

                        DessinView.h

                        #import <UIKit/UIKit.h>
                        
                        @interface DessinView : UIView
                        {
                        	NSMutableArray *pointArray;
                        }
                        
                        @property (nonatomic,retain) NSMutableArray *pointArray;
                        
                        @end

                        PointLocation.m :  C'est juste un NSObject (.m non modifié)

                        PointLocation.h :

                        #import <Foundation/Foundation.h>
                        
                        @interface PointLocation : NSObject {
                        	CGPoint location;
                        }
                        
                        @property (nonatomic,assign) CGPoint location;
                        
                        @end


                        Au niveau du MainStoryBoard : J'ai rajouté des View tout autour de mon DessinVIew après. Comme elle se trouve par dessus ça n'écrit pas dessus quand tu test ton tracé.

                        Il ne me reste plus qu'a faire en sorte que le trait soit continu mais je vais y arriver ;)
                        En tout cas merci pour l'aide ! 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 mai 2013 à 20:19:35 - Message modéré pour le motif suivant : Toute forme de publicité est interdite


                          [XCode IOS] Application pour dessiner

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown