2010-08-10 26 views
23

Je voudrais faire 2 opérations à un zoom UIImageView, tourner, j'ai 2 problèmes:UIImageView Gestures (zoom, rotation) Question

A. Je fais une opération zoom ex. et quand j'essaye de faire la rotation le UIImageView est réglé à la taille initiale, je voudrais savoir garder le zoom UIImageView et faire la rotation de l'image agrandie.

B. Je voudrais combiner l'opération de zoom avec rotation et je ne sais pas ho à mettre en œuvre ceci:

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

Merci

+0

je suis en train de régler le zoom de pincement sur mon application pouvez-vous me dire ce qui est lastScaleFactor dans votre code. Merci d'avance. – Hosni

Répondre

15

je trouve quelque chose qui peut vous intéresser sur le site de l'université stanford:

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

sur ce site, vous devrez faire défiler vers le bas jusqu'à ce que le numéro 14: "Titre: Conférence n ° 14 - MultiTouch"

Télécharger le: "14_MultiTouchDemo.zip"

En Dans cet exemple, vous pouvez redimensionner et faire pivoter chaque image en même temps.

espoir j'ai aidé :)

+0

Cette démo n'utilise pas UIGestureRecognizer, elle résout le sens des touches. –

+0

c'est un super lien. Merci – dubbeat

+0

lien superhit, merci –

3

Lorsque vous utilisez CGAffineTransformMakeScale, vous réinitialisez la transformation de l'identité chaque fois que vous utilisez et vous perdez la précédente information de transformation. Essayez le CGAffineTransformScale(view.transform,scale, scale) pour le zoom de pincement. Vous aurez besoin de conserver la taille d'image originale pour garder le zoom sous contrôle si.
voir: How can I use pinch zoom(UIPinchGestureRecognizer) to change width of a UITextView?

Pour une rotation similaire:

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

Tout mettre en œuvre gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: dans votre délégué.

J'ai un UIPinchGestureRecognizer, un UIPanGestureRecognizer et un UIRotationGestureRecognizer mis en place et je veux qu'ils fonctionnent tous en même temps. J'ai aussi un UITapGestureRecognizer que je fais et non qui veulent être reconnus simultanément.Tout ce que je l'ai fait était le suivant:

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

    return NO; 
} 
63

Espérons que cela peut vous être utile, voilà comment je mets en œuvre habituellement de reconnaissance de geste:

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éthode Rotation: Réinitialiser la rotation du geste de reconnaissance à 0 après l'application de sorte que le prochain rappel est un delta de la rotation actuelle

- (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éthode d'échelle, à la fin réinitialiser l'échelle de la reconnaissance de geste à 1 après l'application de sorte que le rappel suivant est un delta du cur louer échelle

- (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 faire en sorte que le pincement, casserole et faites pivoter reconnaisseurs geste sur une vue particulière peuvent tous reconnaître à prévenir en même temps d'autres dispositifs de reconnaissance de geste de reconnaître simultanément

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

échelle et la rotation des transformations sont appliquées par rapport à le point d'ancrage de la couche cette méthode déplace le point d'ancrage d'une vue de reconnaissance de mouvement entre les doigts de l'utilisateur

- (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; 
    } 
} 
+1

C'est super, merci. – spstanley

+1

code génial. doux –

+1

+1. Bon travail!! – Tirth

2

Je sais que c'est un très vieux fil, je suis tombé sur cette sous-classe imageview, qui fonctionne bien pour zoom, rotation et panoramique. Il utilise la reconnaissance de gestes sur une imageview. Je l'utilise pour l'une de mes applications.

ZoomRotatePanImageView

+0

Merci beaucoup, c'est exactement ce que je cherchais. –