Pregunta

Tengo un error pegajosa que me parece que no puede averiguar, y yo creo que tiene algo que ver con la forma en que se implementa touchesMoved.

en touchesMoved, puedo comprobar para ver donde el contacto es (if) y luego en consecuencia, llamar setNeedsDisplayWithRect en un área de 40 por 40 cerca del punto de contacto. Lo que pasa es que en drawRect una imagen en negro se dejó si había una imagen en blanco allí antes, y viceversa. Al mismo tiempo que estoy llamando setNeedsDisplayWithRect, Soy la creación de una variable booleana en un array de booleanos, para que pueda realizar un seguimiento de lo que es la imagen actual, y por lo tanto mostrar lo contrario. (En realidad, no siempre voltear la imagen ... miro lo que el primer contacto se va a hacer, como cambiar de negro a blanco, y luego poner imágenes en blanco en todos los detalles posteriores, por lo que es una especie de dibujo o borrar con las imágenes).

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

Mi problema es que la matriz booleana parece estar fuera de sintonía con las imágenes que estoy poniendo abajo. Esto sólo ocurre si arrastro muy rápido por la pantalla. Eventualmente, la matriz booleana y las imágenes ya no están sincronizados, a pesar de que los puse al mismo tiempo. Cualquier idea de lo que está causando esto, o lo que puedo hacer para solucionarlo?

Aquí está mi 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))]; 


}
¿Fue útil?

Solución

Me di cuenta de que la respuesta a esto. touchX y delicados eran variables de instancia, y que estaban recibiendo de reposición en touchesMoved antes de cada llamada a drawRect fue completa. Por lo tanto, si me movía rápido en la pantalla, touchesMoved conseguiría llamada, a continuación, llamar drawRect, entonces sería touchesMoved llamará de nuevo antes de drawRect había utilizado touchX y delicado, por lo que el dibujo sería perder la sincronización con la matriz booleana backend.

Para solucionar esto, he dejado de utilizar touchX y delicado en drawRect, y comenzó a derivar el mismo punto mediante el uso de la rect sucia que se fue pasando desde touchesMoved.

Tada!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top