Frage

Ich habe einen klebrigen Fehler, die ich nicht scheinen, um herauszufinden kann, und ich glaube, es hat etwas mit der Art und Weise zu tun touchesMoved umgesetzt wird.

in touchesMoved, überprüfe ich, um zu sehen, wo die Berührung ist (if-Anweisung) und dann entsprechend, rufe setNeedsDisplayWithRect auf ein 40 mal 40 Gebiet in der Nähe des Berührungspunktes. Was in DrawRect passiert ist, dass ein schwarzes Bild hinstellen, wenn es dort ein weißes Bild vorher war, und umgekehrt. Zur gleichen Zeit ich rufe setNeedsDisplayWithRect, ich bin in einem Array von booleans eine boolesche Variable einstellen, so kann ich zu verfolgen, was das aktuelle Bild ist, und damit das Gegenteil angezeigt werden soll. (Tatsächlich, ich Flip nicht immer das Bild ... Ich sehe, was die erste Berührung tun wird, wie Wechsel von Schwarz zu Weiß, und dann weiß stellten Bilder auf allen nachfolgenden berührt, so ist es ein bisschen wie Zeichnung oder Löschen mit den Bildern).

- (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))];
        }
    }
}

Mein Problem ist, dass die Booleschen Array scheint mit den Bildern aus dem Gleichgewicht geraten zu sein, nach unten Ich setze. Dies geschieht nur, wenn ich wirklich schnell über den Bildschirm ziehen. Schließlich wird der boolean-Array und die Bilder sind nicht mehr synchron, auch wenn ich sie zur gleichen Zeit eingestellt. Jede Idee, was dies verursacht, oder das, was ich kann es zu beheben?

Hier ist mein 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))]; 


}
War es hilfreich?

Lösung

dachte ich, die Antwort auf diese aus. touchX und reizbar waren Instanzvariablen, und sie wurden zurückgesetzt in touchesMoved immer vor jedem Anruf drawRect vollständig war. Deshalb, wenn ich schnell auf dem Bildschirm bewegt, würde touchesMoved aufgerufen, dann drawRect rufen, dann würde touchesMoved wieder aufgerufen, bevor drawRect touchX benutzt hatte und reizbar, so würde die Zeichnung nicht synchron mit dem Booleschen Array Backend bekommen.

dieses Problem zu lösen, habe ich aufgehört touchX und Touchy in drawRect verwenden, und begann mit dem gleichen Punkt Ableitung durch die schmutzige rect verwenden, die in von touchesMoved weitergegeben wurden.

tada!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top