iphone uiimageview zoom rotation pinch

iphone - UIImageView Gestures(Zoom, Rotar) Pregunta



rotation pinch (5)

Me gustaría realizar 2 operaciones en un zoom UIImageView , rotar, tengo 2 problemas:

A. Hago una operación para zoom por ej. y cuando intento realizar la rotación, el UIImageView se configura en tamaño inicial, me gustaría saber cómo mantener el UIImageView y realizar la rotación desde la imagen ampliada.

B. Me gustaría combinar la operación de zoom con la rotación y no sé cómo implementar esto:

- (void)viewDidLoad { foo = [[UIImageView alloc]initWithFrame:CGRectMake(100.0, 100.0, 600, 800.0)]; foo.userInteractionEnabled = YES; foo.multipleTouchEnabled = YES; foo.image = [UIImage imageNamed:@"earth.jpg"]; foo.contentMode = UIViewContentModeScaleAspectFit; foo.clipsToBounds = YES; [self.view addSubview:foo]; } //---pinch gesture--- UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)]; [foo addGestureRecognizer:pinchGesture]; [pinchGesture release]; //---rotate gesture--- UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotateGesture:)]; [foo addGestureRecognizer:rotateGesture]; [rotateGesture release]; //---handle pinch gesture--- -(IBAction) handlePinchGesture:(UIGestureRecognizer *) sender { NSLog(@"Pinch"); CGFloat factor = [(UIPinchGestureRecognizer *) sender scale]; if (factor > 1) { //---zooming in--- sender.view.transform = CGAffineTransformMakeScale( lastScaleFactor + (factor-1), lastScaleFactor + (factor-1)); } else { //---zooming out--- sender.view.transform = CGAffineTransformMakeScale(lastScaleFactor * factor, lastScaleFactor * factor); } if (sender.state == UIGestureRecognizerStateEnded) { if (factor > 1) { lastScaleFactor += (factor-1); } else { lastScaleFactor *= factor; } } } //---handle rotate gesture--- -(IBAction) handleRotateGesture:(UIGestureRecognizer *) sender { CGFloat rotation = [(UIRotationGestureRecognizer *) sender rotation]; CGAffineTransform transform = CGAffineTransformMakeRotation(rotation + netRotation); sender.view.transform = transform; if (sender.state == UIGestureRecognizerStateEnded) { netRotation += rotation; } }

Gracias


Cuando usa CGAffineTransformMakeScale, está restableciendo la transformación de Identidad cada vez que lo usa y pierde la información de transformación anterior.

Intente usar CGAffineTransformScale(view.transform,scale, scale) para el zoom de pellizco. Sin embargo, deberá conservar el tamaño del marco original para mantener el zoom bajo control.
ver: ¿Cómo puedo usar el zoom de pellizco (UIPinchGestureRecognizer) para cambiar el ancho de un UITextView?

Para rotación similar:

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { view.transform = CGAffineTransformRotate([view transform], [gestureRecognizer rotation]); [gestureRecognizer setRotation:0]; }


Encontré algo que podría interesarte en el sitio web de la universidad de stanford :

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2010-winter

en este sitio, tendrá que desplazarse hacia abajo hasta que vea el número 14: " Título: Lecture # 14 - MultiTouch"

Descargue el: "14_MultiTouchDemo.zip"

En este ejemplo, puede escalar y rotar cada imagen al mismo tiempo.

Espero haberte ayudado :)


Espero que esto pueda serle útil, así es como normalmente implemento los reconocedores de gestos:

UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotatePiece:)]; [piece addGestureRecognizer:rotationGesture]; [rotationGesture release]; UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scalePiece:)]; [pinchGesture setDelegate:self]; [piece addGestureRecognizer:pinchGesture]; [pinchGesture release];

Método de rotación: restablece la rotación del reconocedor de gestos a 0 después de aplicar para que la próxima devolución de llamada sea un delta de la rotación actual

- (void)rotatePiece:(UIRotationGestureRecognizer *)gestureRecognizer { [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { [gestureRecognizer view].transform = CGAffineTransformRotate([[gestureRecognizer view] transform], [gestureRecognizer rotation]); [gestureRecognizer setRotation:0]; } }

Método de escala, al final, reinicie la escala del reconocedor de gestos en 1 después de aplicar, de modo que la próxima devolución de llamada sea un delta de la escala actual

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer { [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]); [gestureRecognizer setScale:1]; } }

A continuación, asegúrese de que todos los reconocedores de gestos de pellizcar, desplazar y rotar en una vista particular puedan reconocer simultáneamente todos los reconocedores de gestos que reconocen simultáneamente.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // if the gesture recognizers are on different views, don''t allow simultaneous recognition if (gestureRecognizer.view != otherGestureRecognizer.view) return NO; // if either of the gesture recognizers is the long press, don''t allow simultaneous recognition if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] || [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) return NO; return YES; }

Las transformaciones de escala y rotación se aplican al punto de anclaje de la capa. Este método mueve el punto de anclaje de la vista del reconocedor de gestos entre los dedos del usuario.

- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { UIView *piece = gestureRecognizer.view; CGPoint locationInView = [gestureRecognizer locationInView:piece]; CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height); piece.center = locationInSuperview; } }


Sé que este es un hilo bastante antiguo, me encontré con esta subclase de vista de imagen, que funciona bien para hacer zoom, rotar y desplazar. Utiliza el reconocedor de gestos en una vista de imagen. Estoy usando esto para una de mis aplicaciones.

ZoomRotatePanImageView


Simplemente implemente gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: en su delegado.

Tengo un UIPinchGestureRecognizer , un UIPanGestureRecognizer y un UIRotationGestureRecognizer configurado y quiero que todos funcionen al mismo tiempo. También tengo un UITapGestureRecognizer que no quiero que me reconozcan simultáneamente. Todo lo que hice fue esto:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if (![gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && ![otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { return YES; } return NO; }