2017-01-04 8 views
3

私はズームのピンチがここでどのように機能するのかについては言及していません。Instagramのズームはどのように機能しますか?

Instagramのズームに気づいた人はいますか?それは動作するためのデフォルトのピンチとして機能しますが、ズームを開始すると、imageViewはデバイスの全画面に展開されます。誰もが知っていることを知ることができますか?

答えて

1

この現象を再現する方法の1つは、UIImageViewUIPinchGestureRecognizerを追加することです。次に、プロパティーをUIPinchGestureRecognizerとし、それに応じてUIImageViewのフレームを拡大/縮小します。 example

1

これにはサードパーティライブラリを使用することをおすすめします。彼らは常に&を使用して簡単に統合することができます。これらをチェックする

試してみてください。

Official apple Guide

Rey Wenderlish guides are pretty nice too

を鼓舞されていませんちょうどGoogleそれ!と幸運!

3

私はちょうどあなたがしているものを行う単純なGithubプロジェクトを作成しました。ここで確認してください: https://github.com/twomedia/TMImageZoom

ジェスチャーの状態の変更を処理するクラスを作成することでこれを実現しました。次に、ウインドウ上にUIImageViewを作成し、元の画像ビューに位置/サイズを設定して、ユーザーがimageViewをズームする効果を作り出します。上記のリンクから小さなスニペットがあります:

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

こんにちは、これをUICollectionViewでどのように使用するかについてのサンプルコードはありますか?これは、最も有望なユースケースのシナリオであるためです。ありがとうございました – JayVDiyk

関連する問題