2011-02-09 29 views
12

Me gustaría manejar el gesto de rotación en mi aplicación de iPhone y rotar un imageView durante esto. Al final del gesto, me gustaría rotar a una posición fija el imageView. Entonces, es decir. si giro la imagen vista de 0 radianes a M_PI/2 radianes, pero en algún lugar a mitad de camino termino con el gesto. Después del final me gustaría probar el ángulo y si cerca de M_PI/2 luego otra vez en M_PI/2 de otro modo a 0.
Aquí está mi código de cómo me trató de hacer esto:UIGestureRecognizer terminando

puedo crear y añadir el reconocedor a mi vista.

UIGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRecognized:)]; 
recognizer.delegate = self; 
[self addGestureRecognizer:recognizer]; 
[recognizer release]; 

métodos Delegado:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if (_imageView) { 
     return YES; 
    } 
    return NO; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

Gesto método reconocido:

- (void)gestureRecognized:(UIRotationGestureRecognizer *)recognizer { 
    _imageView.transform = CGAffineTransformMakeRotation(recognizer.rotation); 
} 

Estos métodos están trabajando, pero aquí está el método de cómo me trató de conseguir el final del gesto. Esto no funciona:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"gesture end"); 
} 

También con la transformación tengo un pequeño problema. A veces regresa al 0 radianes.

Cualquier sugerencia es bienvenida. ¡Gracias!

Respuesta

25

He encontrado la respuesta en otro foro. Espero que esto ayude a alguien más también. Respuesta:

Usted puede detectar el final del gesto mediante la comprobación del estado de la UIRotationGestureRecognizer en su método de acción. Si [estado gestureRecognizer] == UIGestureRecognizerStateEnded entonces está hecho. Si algo hubiera causado que se cancelara (por ejemplo, una llamada telefónica entrando) entonces vería que termina en UIGestureRecognizerStateCancelled en su lugar.

Si desea aplicar la rotación del reconocedor directamente a su vista en lugar de tratarla como un delta desde la ubicación anterior, puede establecer la rotación del reconocedor, su estado es UIGestureRecognizerStateBegan, y luego calculará las compensaciones de ese valor y usted puede aplicarlos directamente. Esto solo requiere que recuerde la rotación a la que terminó por última vez, y luego puede hacer algo como [gestureRecognizer setRotation: lastAppliedRotation] cuando el estado del reconocedor sea UIGestureRecognizerStateBegan.

1

Si el gestureRecognizer reconoce el gesto, de manera predeterminada no se llamará a toquesEnded (se llamará touchesCancelled en su lugar. touchesEnded solo se invocará si el reconocedor no reconoce el gesto). Establezca gestureRecognizer.delaysTouchesEnded en NO, y debería funcionar.

+0

No funciona. ¿Sabes por qué? Todavía no recibe el final. –

+0

Así que ahora se llama al método, pero no cuando lo suelto, se llama después de que inicie la rotación –

+0

. Por lo tanto, no se llama al final. ¿Alguna pista? –

0

Por si acaso esto le sucede así y es la razón por la que usted está leyendo esta pregunta: "terminó" y "reconocidos" son el mismo valor (3). Entonces este código (en swift) no funcionará:

if (gesture.state == .recognized || gesture.state == .changed) { 
} 
else if (gesture.state == .ended) { 
//do something else 
//=> never called 
} 
Cuestiones relacionadas