6

現在、Appleが提供するピンチジェスチャレコグナイザーを使用して画像の縮尺を作成できますが、画像の最大縮尺を制限するにはどうすればよいですか?

私はAppleの SimpleGestureRecognizersサンプルを使用しています。これは、スケールを1に設定し、画像のスケールを非常に簡単にしますが、それを削除すると、突然ジャンプします。これは良くありません。ただし、スケールは常に1に設定されているため、スケールを追跡するのは困難です。

前もって感謝します。

4

3 に答える 3

9

UIKitは、1回のユーザージェスチャ(ピンチ)に対してセレクターメソッドを何度も呼び出します。各呼び出しは、スケールの小さな増分(または減少)を表します。メソッドの各呼び出しを処理し、小さな増分ごとに対応して画像を拡大縮小すると、スムーズなアニメーションが得られます。

レコグナイザーのscaleプロパティを使用して、画像を変更します。次に、プロパティを1.0にリセットして、次にセレクターメソッドが呼び出されたときに、scaleプロパティが最後の増分からの新しい小さな増分のみを表すようにします。もう一度、新しい小さな増分で画像を再スケーリングし、1.0にリセットします。レコグナイザーのスケールをリセットせず、それを使用して画像を再スケールすると、累積的な変化によって画像がスケーリングされ、ジャンプした動作(および誤ったスケーリング)が発生します。

したがって、ジェスチャレコグナイザーのスケールを必ず1にリセットしてください。スケールの全体的な変化を追跡するために、UIImageViewまたはViewControllerのインスタンス変数(「scale」とも呼ばれる)を作成できます。(実際、drawRectでその新しいスケール変数を使用して画像を描画した場合は、セッターでsetNeedsDisplayの呼び出しを追加するだけで済みます。また、スケールが変更されたときに画像を再描画するためのコードを記述する必要はありません。 。)

いずれの場合も、次のコード(Ravinの制限チェックを組み込んでいますが、新しいスケール変数で)がセレクターメソッドで機能するはずです。

- (void)pinch:(UIPinchGestureRecognizer *)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateChanged ||
        recognizer.state == UIGestureRecognizerStateEnded) {
        if (imageView.scale < yourScaleLimit) {
            imageView.scale *= recognizer.scale;
            //any other code to scale up the image if
            //just changing imageView.Scale is not enough
        }
        recognizer.scale = 1.0;
    }
}

これがお役に立てば幸いです。

于 2011-04-13T11:21:55.193 に答える
6

これを1つの場所でのみ実行していて、UIViewまたはUIImageViewをサブクラス化したくない場合は、いくつかのローカル変数を作成して同じ結果を得ることができます。

迅速

// Variables to keep track of the scale
var imageViewScale: CGFloat = 1.0
let maxScale: CGFloat = 4.0
let minScale: CGFloat = 0.5

@objc func handlePinchGesture(recognizer: UIPinchGestureRecognizer) {

    if recognizer.state == .began || recognizer.state == .changed {
        let pinchScale: CGFloat = recognizer.scale

        if imageViewScale * pinchScale < maxScale && imageViewScale * pinchScale > minScale {
            imageViewScale *= pinchScale
            imageView.transform = (imageView.transform.scaledBy(x: pinchScale, y: pinchScale))
        }
        recognizer.scale = 1.0
    }
}

ピンチジェスチャを処理するAppleドキュメント

于 2018-07-09T23:17:58.160 に答える
0

( )のプロパティをgestureRecognizerチェックするセレクターメソッドで、スケーリングしたい値よりも小さい場合は、画像にスケーリングを適用します。それ以外の場合は適用しないでください。たとえば、次のメソッドはthen用です。scalesenderUIPinchGestureRecognizerselectorpinchGesture

-(void)pinchAction:(UIPinchGestureRecognizer *)sender
{
   if(sender.scale<yourScaleLimit)
   {
     //scale up the image
   }

}

ありがとう、

于 2011-04-13T09:36:15.603 に答える