5

画像ビューをズームインおよびズームアウトしたいのですが、そのために UIScrollView を使用したくありません。このために私は UIPinchGestureRecognizer を使用しました。ここに私のコードがあります -

[recognizer view].transform = CGAffineTransformScale([[recognizer view] transform], [recognizer scale], [recognizer scale]);
recognizer.scale = 1;

これは、ズームインとズームアウトで正常に機能しています。しかし、問題は、UIScrollView のように特定のスケールでズームインおよびズームアウトしたいことです。maxZoom と minZoom を設定できます。私はそのための解決策を見つけることができませんでした.UIPinchGestureRecognizerに関するすべてのチュートリアルは同じコードを説明しているだけです.

4

4 に答える 4

14

ジェスチャを処理するクラスのインターフェイスで2 つの ivarCGFloat __scaleとを宣言します。関数の 1 つをオーバーライドして にCGFloat __previousScale設定__scaleします(ここで必ずスーパー コンストラクターを呼び出してください)。1.0init

- (void)zoom:(UIPinchGestureRecognizer *)gesture { 
    NSLog(@"Scale: %f", [gesture scale]);

    if ([gesture state] == UIGestureRecognizerStateBegan) {
        __previousScale = __scale;
    }

    CGFloat currentScale = MAX(MIN([gesture scale] * __scale, MAX_SCALE), MIN_SCALE);  
    CGFloat scaleStep = currentScale / __previousScale;
    [self.view setTransform: CGAffineTransformScale(self.view.transform, scaleStep, scaleStep)];

    __previousScale = currentScale;

    if ([gesture state] == UIGestureRecognizerStateEnded || 
        [gesture state] == UIGestureRecognizerStateCancelled ||
        [gesture state] == UIGestureRecognizerStateFailed) {
        // Gesture can fail (or cancelled?) when the notification and the object is dragged simultaneously
        __scale = currentScale;
        NSLog(@"Final scale: %f", __scale);
    }
}
于 2012-06-09T08:07:24.783 に答える
2
 – (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer 
    {
        if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        // Reset the last scale, necessary if there are multiple objects with different scales
        lastScale = [gestureRecognizer scale];
        }

        if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

        CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@”transform.scale”] floatValue];

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

        CGFloat newScale = 1 –  (lastScale – [gestureRecognizer scale]); // new scale is in the range (0-1)
        newScale = MIN(newScale, kMaxScale / currentScale);
        newScale = MAX(newScale, kMinScale / currentScale);
        CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);
        [gestureRecognizer view].transform = transform;

        lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call
        }

    }
于 2015-06-09T09:15:54.180 に答える
1

私も似たような状況でした。私の要件は、imageViewが最小サイズよりも小さいか、特定の最大サイズよりも大きい場合、imageViewが最後の変換に戻ることでした。

if ((self.frame.size.width > IMAGE_MIN_SIZE) && (self.frame.size.height > IMAGE_MIN_SIZE) && (self.frame.size.width < IMAGE_MAX_SIZE) && (self.frame.size.height < IMAGE_MAX_SIZE)) {
    lastSizeTransform = self.transform;
}else {
    self.transform = lastSizeTransform;
}

ここで、self は imageView です。

于 2012-06-09T05:46:15.300 に答える
1

つまんだ状態でログインview.transformすると、ズームイン・ズームアウトした自分のイメージコーディネートが見られます。したがって、このソリューションは期待どおりに機能しません。私はそのような解決策を作りました。

Obj-C バージョン

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

        [recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, 
recognizer.scale, recognizer.scale)];

        if (recognizer.view.transform.a > 1.6) {

            CGAffineTransform fooTransform = recognizer.view.transform;
            fooTransform.a = 1.6; // this is x coordinate
            fooTransform.d = 1.6; // this is y coordinate
            recognizer.view.transform = fooTransform;
        }

        if (recognizer.view.transform.a < 0.95) {

            CGAffineTransform fooTransform = recognizer.view.transform;
            fooTransform.a = 0.95; // this is x coordinate
            fooTransform.d = 0.95; // this is y coordinate
            recognizer.view.transform = fooTransform;
        }
        recognizer.scale = 1.0;
    }

スウィフト版

func handlePinchGesture(recognizer: UIPinchGestureRecognizer) {

        if let view = recognizer.view {
            view.transform = CGAffineTransformScale(view.transform,
                recognizer.scale, recognizer.scale)
            if CGFloat(view.transform.a) > 1.6 {
                view.transform.a = 1.6 // this is x coordinate
                view.transform.d = 1.6 // this is x coordinate
            }
            if CGFloat(view.transform.d) < 0.95 {
                view.transform.a = 0.95 // this is x coordinate
                view.transform.d = 0.95 // this is x coordinate
            }
            recognizer.scale = 1
        }
    }
于 2015-10-20T08:42:44.167 に答える