2013-03-15 2 views
0

Je sais qu'il y a de meilleurs moyens pour réaliser des outils de dessin en utilisant CoreGraphics et quoi-non, j'utilise cette méthode UIView parce que je veux obtenir un effet pixélisé et j'en ai d'autres choses personnalisées à l'esprit qu'il serait difficile de faire avec le code CG intégré.



J'ai une grille de 400 UIViews pour créer ma toile pixélisé ...
L'utilisateur sélectionne une couleur de peinture et commence à glisser leur doigt sur la toile de 400 UIViews, comme le doigt frappe un UIView la la couleur de ce UIView (aka pixel) va changer à la couleur que l'utilisateur a choisi ...

Maintenant j'ai codé le tout et tout fonctionne, mais il est laggy (parce que j'utilise touchesMoved) et de nombreux points sont sauté ...Vérifie quand l'utilisateur glisse sur UIView - touchesMové trop laggy



Je suis c J'utilise actuellement des touches tactiles et je déplace un UIView vers l'emplacement des doigts (j'appelle cela le fingerLocationRect).

Lorsque je mets à jour (1 400 UIViews miniatures) la couleur d'un pixel que je fais en vérifiant si le fingerLocationRect est intersection un de mes rects de UIView. Si c'est le cas, je mets à jour la couleur.

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPosition = [touch locationInView:self.view]; 
    fingerLocationRect.center = CGPointMake(currentPosition.x, currentPosition.y); 
    int tagID = 1; 
    while (tagID <= 400) { 
     if(CGRectIntersectsRect(fingerLocationRect.frame, [drawingView viewWithTag:tagID].frame)) { 
      [drawingView viewWithTag:tagID].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f]; 
     } 
     tagID ++; 
    } 
} 



Le problème est que touchesMoved est pas mis à jour très souvent ... donc si je fais glisser mon doigt sur la toile que comme 5 des pixels changent au lieu de 40 en fait je touché.



Je me demande si vous utilisez CGRectIntersectsRect avec touchesMoved est la meilleure méthode pour détecter si les diapositives utilisateur d'un UIView ... En ce moment il est pas mis à jour presque assez vite et je suis obtenir le résultat à gauche au lieu du résultat à droite. (Je n'obtenir l'effet sur le droit si je déplace le doigt très lentement ...)

enter image description here



Tout cela étant dit, est-il une méthode pour détecter quand un utilisateur glisse sur une autre UIView que d'utiliser touchesMoved? Si non, des idées sur la façon de saisir toutes les UIViews entre les emplacements tactiles retournés par touchesMoved? Je les ai tous ayant des étiquettes de 1-400 (la première rangée est 1-10, la deuxième rangée est 11-21, etc.)

P.s. si un panGestureRecognizer mis à jour plus fréquemment qu'un touchesMoved?


Pour avoir une idée de ce que les 400 UIViews ressemblent ici ils sont tous avec arc4random couleurs à base:

enter image description here



Répondre

2

Vous Boucler dans 400 vues chaque fois touchesMoved: est appelé. Vous avez juste besoin de faire un peu de calcul pour déterminer quelle vue de la grille est touchée.Si l'on suppose que drawingView est la « toile » vue qui contient tous les 400 « pixels » et les balises sont classés du haut à gauche au bas à droite, puis:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject];  
    CGPoint point = [touch locationInView:drawingView]; 
    NSInteger column = floorf(20 * point.x/drawingView.bounds.size.width); //20 is the number of column in the canvas 
    NSInteger row = floorf(20 * point.y/drawingView.bounds.size.height); //20 is the number of rows in the canvas 
    [viewWithTag:column + 20*row].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f]; 
} 

Cette méthode d'amélioration de la performance permettra le cacao de faire plus appels fréquents aux touchesMouvé:

+0

Brillant! :) :) :) :) C'est en fait une méthode que je peux appliquer à mes jeux de tuiles sur lesquels je travaille aussi haha! –

Questions connexes