2012-01-08 10 views
8

Tengo un pequeño problema con mis reconocedores de gestos.Pan gesto desordena la dirección en función de la rotación

Tengo una clase llamada "Sprite" que es solo un UIImageView. Sprite tiene sus propios reconocedores de gestos y métodos de manejo para que el usuario pueda desplazarse, rotar y cambiar el tamaño del gráfico.

Aquí está mi código:

-(void)setup{ //sets up the imageview... 
//add the image, frame, etc. 
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)]; 
    UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotate:)]; 

    [self addGestureRecognizer:panGesture]; 
    [self addGestureRecognizer:pinchGesture]; 
    [self addGestureRecognizer:rotateGesture]; 
} 

//handling methods 
-(void)handlePinch:(UIPinchGestureRecognizer *)recognizer{ 
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale); 
    recognizer.scale = 1; 
} 

-(void)handleRotate:(UIRotationGestureRecognizer *)recognizer{ 
    recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation); 
    recognizer.rotation = 0; 
} 
-(void)handlePan:(UIPanGestureRecognizer *)recognizer{ 
    CGPoint translation = [recognizer translationInView:self]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self] 
} 

Así que, básicamente, cada uno de ellos funciona bien por su propia cuenta. Sin embargo, cuando giro o cambio el tamaño de la vista de imagen, la panorámica resulta problemática. Por ejemplo, si gira la imagen vista al revés, los gestos de panoramización moverán la imagen en el sentido inverso (hacia arriba, hacia la izquierda, hacia la derecha, etc.). Del mismo modo, un sprite redimensionado no se desplazará a la misma velocidad/distancia que antes.

¿Alguna idea sobre cómo puedo solucionar esto? Preferiría mantener este código dentro de la clase Sprite en lugar de ViewController (si es posible). Gracias.

Respuesta

12

En lugar de translationInView: self, try translationInView: self.superview.

+0

Txs @Jerry, gran respuesta. ¡Esto me estaba volviendo completamente loco! –

+0

@Jerry, funciona bien ... –

Cuestiones relacionadas