2017-01-04 3 views
3

Ich spreche nicht davon, wie Prise Zoomen hier funktioniert.Wie funktioniert Instagrams Zoomen?

Hat jemand Instagram's Zoomen bemerkt? Es funktioniert wie eine Standard-Pinch zu arbeiten, aber wenn Sie mit dem Einzoomen beginnen erweitert sich ImageView auf den gesamten Bildschirm des Geräts, wie geht es ihnen so reibungslos? Wer weiß, kann darauf hinweisen?

Antwort

1

Eine Möglichkeit, dieses Verhalten zu replizieren, könnte darin bestehen, UIPinchGestureRecognizer zu Ihrem UIImageView hinzuzufügen. Dann verwenden Sie die scale Eigenschaft der UIPinchGestureRecognizer und skalieren Sie den Rahmen der UIImageView entsprechend. example

3

Ich habe ein einfaches Github-Projekt erstellt, das genau das tut, wonach Sie suchen. Überprüfen Sie es hier: https://github.com/twomedia/TMImageZoom

Ich erreichte dies durch Erstellen einer Klasse, die die Gestenstatusänderungen behandelt. Ich erstelle dann ein UIImageView auf dem Fenster und positioniere/grösse es auf die ursprüngliche Bildansicht, die den Effekt des Benutzers verursacht, der das imageView zoomt. Hier ist ein kleiner Ausschnitt aus dem obigen Link:

-(void) gestureStateChanged:(id)gesture withZoomImageView:(UIImageView*)imageView { 

// Insure user is passing correct UIPinchGestureRecognizer class. 
if (![gesture isKindOfClass:[UIPinchGestureRecognizer class]]) { 
    NSLog(@"(TMImageZoom): Must be using a UIPinchGestureRecognizer, currently you're using a: %@",[gesture class]); 
    return; 
} 

UIPinchGestureRecognizer *theGesture = gesture; 

// Prevent animation issues if currently animating reset. 
if (isAnimatingReset) { 
    return; 
} 

// Reset zoom if state = UIGestureRecognizerStateEnded 
if (theGesture.state == UIGestureRecognizerStateEnded || theGesture.state == UIGestureRecognizerStateCancelled || theGesture.state == UIGestureRecognizerStateFailed) { 
    [self resetImageZoom]; 
} 

// Ignore other views trying to start zoom if already zooming with another view 
if (isHandlingGesture && hostImageView != imageView) { 
    NSLog(@"(TMImageZoom): 'gestureStateChanged:' ignored since this imageView isnt being tracked"); 
    return; 
} 

// Start handling gestures if state = UIGestureRecognizerStateBegan and not already handling gestures. 
if (!isHandlingGesture && theGesture.state == UIGestureRecognizerStateBegan) { 
    isHandlingGesture = YES; 

    // Set Host ImageView 
    hostImageView = imageView; 
    imageView.hidden = YES; 

    // Convert local point to window coordinates 
    CGPoint point = [imageView convertPoint:imageView.frame.origin toView:nil]; 
    startingRect = CGRectMake(point.x, point.y, imageView.frame.size.width, imageView.frame.size.height); 

    // Post Notification 
    [[NSNotificationCenter defaultCenter] postNotificationName:TMImageZoom_Started_Zoom_Notification object:nil]; 

    // Get current window and set starting vars 
    UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow; 
    firstCenterPoint = [theGesture locationInView:currentWindow]; 

    // Init zoom ImageView 
    currentImageView = [[UIImageView alloc] initWithImage:imageView.image]; 
    currentImageView.contentMode = UIViewContentModeScaleAspectFill; 
    [currentImageView setFrame:startingRect]; 
    [currentWindow addSubview:currentImageView]; 
} 

// Reset if user removes a finger (Since center calculation would cause image to jump to finger as center. Maybe this could be improved later) 
if (theGesture.numberOfTouches < 2) { 
    [self resetImageZoom]; 
    return; 
} 

// Update scale & center 
if (theGesture.state == UIGestureRecognizerStateChanged) { 
    NSLog(@"gesture.scale = %f", theGesture.scale); 

    // Calculate new image scale. 
    CGFloat currentScale = currentImageView.frame.size.width/startingRect.size.width; 
    CGFloat newScale = currentScale * theGesture.scale; 
    [currentImageView setFrame:CGRectMake(currentImageView.frame.origin.x, currentImageView.frame.origin.y, startingRect.size.width*newScale, startingRect.size.height*newScale)]; 

    // Calculate new center 
    UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow; 
    int centerXDif = firstCenterPoint.x-[theGesture locationInView:currentWindow].x; 
    int centerYDif = firstCenterPoint.y-[theGesture locationInView:currentWindow].y; 
    currentImageView.center = CGPointMake((startingRect.origin.x+(startingRect.size.width/2))-centerXDif, (startingRect.origin.y+(startingRect.size.height/2))-centerYDif); 

    // Reset gesture scale 
    theGesture.scale = 1; 
} 
} 
+0

Hallo, irgendwelche Beispielcodes zur Verwendung in UICollectionView? Weil es das wahrscheinlichste Anwendungsszenario ist. Vielen Dank – JayVDiyk