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))];
}
qu'est-ce que dirty rect signifie? –