39 votes

UIPinchGestureRecognizer positionne la vue pincée entre les deux doigts.

J'ai réussi à mettre en place un pincement et un zoom d'une vue. Cependant, la vue ne se positionne pas là où je le souhaitais. Pour les stackoverflowers ayant un iPad, j'aimerais que ma vue soit centrée comme sur l'application Photos.app de l'iPad : lorsque vous pincez&zoomer sur un album, les photos se présentent dans une vue qui s'étend. Cette vue est approximativement centrée avec le coin supérieur droit sur le premier doigt et le coin inférieur gauche sur l'autre doigt. Je l'ai mélangé avec un détecteur de panoramique, mais de cette façon l'utilisateur doit toujours pincer, puis faire un panoramique pour ajuster.

Voici donc des explications graphiques, je pourrais poster une vidéo de mon application si cela n'est pas clair (pas de secret, j'essaie de reproduire le Photos.app de l'iPad...)

Donc pour une position initiale des doigts, en commençant le zoom :

enter image description here

Voici l'image actuelle "zoomée" pour le moment. Le carré est plus grand, mais la position est sous les doigts.

given the start position

Voici ce que j'aimerais avoir : même taille, mais origines différentes en x et y :

enter image description here

(désolé pour mes pauvres compétences en photoshop ^^)

43voto

md_develop Points 548

Vous pouvez obtenir le CGPoint du point médian entre deux doigts via le code suivant dans la méthode handlingPinchGesture .

CGPoint point = [sender locationInView:self];

Tout mon handlePinchGesture est ci-dessous.

/*
instance variables

CGFloat lastScale;
CGPoint lastPoint;
*/

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender {
    if ([sender numberOfTouches] < 2)
        return;

    if (sender.state == UIGestureRecognizerStateBegan) {
        lastScale = 1.0;
        lastPoint = [sender locationInView:self];
    }

    // Scale
    CGFloat scale = 1.0 - (lastScale - sender.scale);
    [self.layer setAffineTransform:
        CGAffineTransformScale([self.layer affineTransform], 
                               scale, 
                               scale)];
    lastScale = sender.scale;

    // Translate
    CGPoint point = [sender locationInView:self];
    [self.layer setAffineTransform:
        CGAffineTransformTranslate([self.layer affineTransform], 
                                   point.x - lastPoint.x, 
                                   point.y - lastPoint.y)];
    lastPoint = [sender locationInView:self];
}

11voto

phix23 Points 24407

Jetez un coup d'œil à la Exemple de projet Touches . Plus précisément, ces méthodes pourraient vous aider :

// scale and rotation transforms are applied relative to the layer's anchor point
// this method moves a gesture recognizer's view's anchor point between the user's fingers
- (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;
    }
}

// scale the piece by the current scale
// reset the gesture recognizer's rotation to 0 after applying so the next callback is a delta from the current scale
- (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];
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X