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

A. puedo hacer una operación de zoom para ex. y cuando trato de hacer la rotación de la UIImageView se establece en tamaño inicial, me gustaría saber cómo mantener el zoom UIImageView y hacer la rotación de la imagen ampliada.

B. me gustaría combinar la operación de zoom con la rotación y no sé ho para implementar esta:

- (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

  • estoy tratando de configurar el zoom de pellizco en mi aplicación puede usted decirme qué es lastScaleFactor en el código. Gracias de antemano.

5 Comentarios

  1. 63

    Espero que esto puede ser útil para usted, que es lo que me suele implementar gesto reconocedores:

    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 Rotate: Restablecer el gesto de reconocimiento de la rotación a 0 después de la aplicación así que la próxima devolución de llamada es 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, a fin de restablecer el gesto de reconocimiento de la escala a 1 después de la aplicación así que la próxima devolución de llamada es 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];
    }
    }

    Que asegurarse de que el pellizco, el pan y el gesto de rotación reconocedores en un determinado punto de vista puede reconocer simultáneamente evitar que otro gesto reconocedores de reconocer 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;
    }

    Escala y la rotación de transformaciones se aplican con relación a la capa del punto de anclaje de este método mueve un gesto de reconocimiento de la vista del punto de anclaje 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;
    }
    }
    • Esto es genial, gracias.
    • impresionante código. dulce
    • +1. Buen trabajo!!
    • guarda mi todo el día. Gracias!!
  2. 16

    Acaba de implementar gestureRecognizer:shouldRecognizeSimultaneouslyWithgesturerecognizer: en su delegado.

    Tengo un UIPinchGestureRecognizer, un UIPanGestureRecognizer y un UIRotationGestureRecognizer configurar y quiero que todos trabajen al mismo tiempo. También tengo un UITapGestureRecognizer que hago no quieren ser reconocidos de forma simultánea. 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;
    }
  3. 15

    He encontrado algo que puede interesarte sobre el de la universidad de stanford sitio web:

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

    en este sitio usted tendrá que desplazarse hacia abajo hasta que vea el número 14: «Título: Conferencia #14 – MultiTouch»

    Descarga el: «14_MultiTouchDemo.zip»

    En este ejemplo, usted puede escalar y rotar cada una de las imágenes al mismo tiempo.

    espero que me ayudó 🙂

    • Esta demo no uso UIGestureRecognizer, resuelve el la toca significado.
    • eso es un gran enlace. Gracias
    • superhit enlace, gracias
    • gracias! muy útil 🙂
  4. 3

    Cuando se utiliza CGAffineTransformMakeScale, restablece la transformación de la Identidad cada vez que la utilice y se pierde la anterior transformación de la información.

    Trate de usar CGAffineTransformScale(view.transform,scale, scale) para el pinch zoom. Usted necesidad de mantener la imagen original de tamaño para mantener el zoom bajo control, aunque.

    ver: ¿Cómo puedo utilizar el zoom de pellizco(UIPinchGestureRecognizer) para cambiar la anchura de un UITextView?

    Para la rotación del mismo modo:

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

    Sé que esta es una muy pasado de rosca, me encontré con este imageview subclase, que funciona bien para hacer zoom, rotar y pan. Utiliza gesto de reconocimiento en un imageview. Estoy usando esto para uno de mis app.

    ZoomRotatePanImageView

    • Muchas gracias, esto es exactamente lo que yo estaba buscando.

Dejar respuesta

Please enter your comment!
Please enter your name here