2009-04-21 6 views
0

J'ai un bug collant que je n'arrive pas à comprendre, et je pense que cela a quelque chose à voir avec la façon dont touchesMoved est implémenté.Problème avec touchesMoved et drawRect

dans touchesMoved, je vérifie pour voir où la touche est (if déclaration) et puis en conséquence, appelez setNeedsDisplayWithRect sur une zone de 40 par 40 près du point de contact. Qu'est-ce qui se passe dans DrawRect est qu'une image noire est posée s'il y avait une image blanche là-bas, et vice versa. En même temps j'appelle setNeedsDisplayWithRect, je suis en train de définir une variable booléenne dans un tableau de booléens, donc je peux garder une trace de ce qu'est l'image actuelle, et donc afficher le contraire. (En fait, je ne retourne pas toujours l'image ... Je regarde ce que le premier contact va faire, comme passer du noir au blanc, puis mettre des images blanches sur toutes les touches suivantes, donc c'est un peu comme dessiner ou effacement avec les images).

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self]; 
    CGPoint lastTouchPoint = [touch previousLocationInView:self]; 

    touchX = touchPoint.x; 
    touchY = touchPoint.y; 

    int lastX = (int)floor((lastTouchPoint.x+0.001)/40); 
    int lastY = (int)floor((lastTouchPoint.y+0.001)/40); 
    int currentX = (int)(floor((touchPoint.x+0.001)/40)); 
    int currentY = (int)(floor((touchPoint.y+0.001)/40)); 

    if ((abs((currentX-lastX)) >=1) || (abs((currentY-lastY)) >=1)) 
    { 
     if ([soundArray buttonStateForRow:currentX column:currentY] == firstTouchColor){ 
      [soundArray setButtonState:!firstTouchColor row:(int)(floor((touchPoint.x+0.001)/40)) column:(int)(floor((touchPoint.y+0.001)/40))]; 

      [self setNeedsDisplayInRect:(CGRectMake((CGFloat)(floor((touchPoint.x+0.001)/40)*40), (CGFloat)(floor((touchPoint.y+0.001)/40)*40), (CGFloat)40.0, (CGFloat)40.0))]; 
     } 
    } 
} 

Mon problème est que le tableau booléen semble être détraqué avec les images que je pose. Cela n'arrive que si je traîne très vite sur l'écran. Finalement, le tableau booléen et les images ne sont plus synchronisés, même si je les ai définis en même temps. Une idée de ce qui cause cela, ou ce que je peux faire pour le réparer?

Voici mon drawRect:

- (void)drawRect:(CGRect)rect { 

    if ([soundArray buttonStateForRow:(int)(floor((touchX+0.001)/40)) column:(int)(floor((touchY+0.001)/40))]) 
     [whiteImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))]; 
    else 
     [blackImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))]; 


} 

Répondre

0

je me suis dit la réponse à cette question. touchX et touchY étaient des variables d'instance, et elles étaient réinitialisées dans touchesMoved avant chaque appel à drawRect. Par conséquent, si je me déplaçais rapidement à l'écran, touchesMoved serait appelé, puis appelez drawRect, puis touchesMoved serait à nouveau appelé avant que drawRect ait utilisé touchX et touchY, donc le dessin serait désynchronisé avec le backend de tableau booléen. Pour résoudre ce problème, j'ai arrêté d'utiliser touchX et touchY dans drawRect, et j'ai commencé à dériver le même point en utilisant le rectangle sale qui était passé à partir de touchesMoved.

tada!

+0

qu'est-ce que dirty rect signifie? –