2012-03-17 19 views
9

Estoy implementando un arrastrar/soltar/cambiar el tamaño/rotar etiquetas dentro de mi aplicación. Hasta ahora, todo funciona, excepto por el gesto UIRotationGestureRecognizer. Más específicamente, no funciona con el gesto UIPinchGestureRecognizer.iPhone iOS cómo hacer que UIRotationGestureRecognizer y UIPinchGestureRecognizer trabajen juntos para escalar y rotar una UIView con subvistas?

Normalmente, los dos gestos compiten por dos toques con los dedos, así que los estoy ejecutando en paralelo. A continuación se muestran mis 2 métodos que invocan los reconocedores de gestos.

Al hacer el gesto de rotación, la vista gira salvajemente alrededor de su centro, con su altura y ancho cambiando de la siguiente manera: la altura se convierte en ancho, el ancho se convierte lentamente en altura. Eventualmente, la vista desaparece.

En la vista, tengo otra vista de cambio de tamaño automático. Normalmente, el gesto de pellizco también cambia automáticamente el tamaño de las subvistas, pero en este caso las subvistas con máscaras de aumento de tamaño desaparecen. Las subvistas tienen resortes de altura y ancho y puntal izquierdo/superior.

¿Qué estoy haciendo mal? ¿Cómo puedo cambiar el tamaño y escalar una UIView con gestos?

Todos los métodos de delegado y las conexiones se configuran correctamente. Necesito entender cómo manejar el orden en que los reconocedores aplicarían la escala y la rotación.

//makes 2 gesture recognizers behave together 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 
    return YES; 
} 

- (IBAction)handleRotationFrom:(id)sender { 
    NSLog(@"Gesture rotation %.1f", rotationGestureRecognizer.rotation); 

//attempt to continuously rotate the label, starting with a remembered rotation  

    float rotation = atan2(activeCompanionLabelView.transform.b, activeCompanionLabelView.transform.a); 
    NSLog(@"existing rotation %.1f", rotation); 

// rotation = rotation<0?(2*M_PI)-fabs(rotation):rotation; 
    rotation +=rotationGestureRecognizer.rotation; 

    NSLog(@"*** gesture rotation %.1f sum: %.1f, saved: %.1f",rotationGestureRecognizer.rotation, rotation, activeCompanionLabelView.savedRotation); 
    activeCompanionLabelView.transform = CGAffineTransformMakeRotation((rotation)); 
    activeCompanionLabelView.savedRotation = rotation; 
} 

- (IBAction)handlePinch:(id)sender { 
    NSLog(@"pinch %.2f", pinchGestureRecognizer.scale); 

//resize, keeping the origin where it was before 

    activeCompanionLabelView.frame = CGRectMake(activeLabelContainerFrame.origin.x, activeLabelContainerFrame.origin.y, activeLabelContainerFrame.size.width*pinchGestureRecognizer.scale, activeLabelContainerFrame.size.height*pinchGestureRecognizer.scale);  



} 

Respuesta

10

Si quieres dos gestureRecognisers funcionen en paralelo (simultáneamente) a su view debe aplicar <UIGestureRecognizerDelegate>.

Además, debe convertirlo en un delegado de ambos gestureRecognizers.

rotationGestureRecognizer.delegate=self; 
pinchGestureRecognizer.delegate=self; 

Y también se debe aplicar shouldRecognizeSimultaneouslyWithGestureRecognizer: método:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

    return YES; 
} 

NOTA: si tiene más de dos, entonces este gestureRecognisers en su view que vamos a tener que añadir un poco de identidad de comprobar en este método.

EDIT:

acaba de encontrar el artículo de Ole Begemann sobre este tema: Gesture Recognition on iOS with Attention to Detail

+0

que ya tienen este código en su sitio. Aclaré la pregunta con esta información. –

+0

@AlexStone: ya veo. No estoy en mi Mac en este momento, pero tendría que hacer algunas pruebas con esto. Puedo enmendar mi respuesta mañana si nadie más se presenta. –

+0

Tengo el mismo problema ahora ... ¿obtuviste una solución a esto? – Prathiba

Cuestiones relacionadas