2014-04-23 11 views
6

Ich kann UIPinchGestureRecognizer für das Zoomen in der Ansicht eines UICollectionViewCell verwenden, aber es spielt keine Rolle, wo Sie anfangen, die UIPinch Geste zu machen, immer der Zoom geht in der Mitte der Ansicht. Zum Beispiel möchte ich im oberen linken Bereich der Ansicht eine Quetschung machen, und der Zoom muss in der Position erzeugt werden, in der ich den Bildschirm berühre. Aber wenn ich das tue, wird der Zoom in der Mitte der Ansicht erstellt.UIPinchGestureRecognizer. Machen Sie Zoom-Position von Fingern, nicht nur in der Mitte

Dies ist der Code, den ich für die Herstellung von Zoom verwenden:

if([gesture state] == UIGestureRecognizerStateBegan) { 
     previousScale = 1.0; 

    } 

    if (
     [gesture state] == UIGestureRecognizerStateChanged) { 

     CGFloat currentScale = [[[gesture view].layer valueForKeyPath:@"transform.scale"] floatValue]; 

     // Constants to adjust the max/min values of zoom 
     const CGFloat kMaxScale = 4.0; 
     const CGFloat kMinScale = 1.0; 

     CGFloat newScale = 1 - (previousScale - [gesture scale]); // new scale is in the range (0-1) 
     newScale = MIN(newScale, kMaxScale/currentScale); 
     newScale = MAX(newScale, kMinScale/currentScale); 
     scale = newScale; 

     CGAffineTransform transform = CGAffineTransformScale([[gesture view] transform], newScale, newScale); 

     [gesture view].transform = transform; 

     [self.collectionView.collectionViewLayout invalidateLayout]; 
    } 

Wie kann ich die Position des UIPinchGesture wählen?

Dank

Antwort

16

Sie sind der Maßstab Transformation nur die Anwendung, die immer den Blick in der Mitte halten. Neben der Skalierung müssen Sie auch eine Übersetzung basierend auf dem Absender locationInView durchführen. Sie können die obige Funktion durch den folgenden Code ersetzen:

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender { 


    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]; 
} 
+0

Hallo Khawar, nachdem diese implementieren, ich bin ein weiteres Problem mit mit dem Übersetzen . Die Ansicht, die ich transformiere, verlässt die Grenzen der Hauptansicht, und ich möchte wissen, welche Bedingung ich prüfen muss, um dies zu vermeiden, und die Transformation CGAffineTransformIdentity in die Gestenansicht implementieren. Ich habe eine Frage gestellt, hier ist es die Verbindung mit einem GIF, das das Problem darstellt: http://stackoverflow.com/questions/23269622/prevent-uicollectionviewcell-view-of-going-off-screen-after-zooming-with-uipinch. Danke – santibernaldo

+0

@khawarAli wo sollte ich Geste hinzufügen? – Dalvik

+0

hinzufügen MainView.clipsToBounds = YES; –

3

Ich habe es getan, das ist mein letzter Code:

if([gesture state] == UIGestureRecognizerStateBegan) { 
    previousScale = 1.0; 
    lastPoint = [gesture locationInView:[gesture view]]; 
} 

if (
    [gesture state] == UIGestureRecognizerStateChanged) { 

    CGFloat currentScale = [[[gesture view].layer valueForKeyPath:@"transform.scale"] floatValue]; 

    // Constants to adjust the max/min values of zoom 
    const CGFloat kMaxScale = 4.0; 
    const CGFloat kMinScale = 1.0; 

    CGFloat newScale = 1 - (previousScale - [gesture scale]); // new scale is in the range (0-1) 
    newScale = MIN(newScale, kMaxScale/currentScale); 
    newScale = MAX(newScale, kMinScale/currentScale); 
    scale = newScale; 

    CGAffineTransform transform = CGAffineTransformScale([[gesture view] transform], newScale, newScale); 

    [gesture view].transform = transform; 

    CGPoint point = [gesture locationInView:[gesture view]]; 
    CGAffineTransform transformTranslate = CGAffineTransformTranslate([[gesture view] transform], point.x-lastPoint.x, point.y-lastPoint.y); 

    [gesture view].transform = transformTranslate; 
}