web-dev-qa-db-ja.com

UIViewの現在のスケールを知る方法は?

UIViewの現在のスケール(ズームレベル)をどのように見つけますか?

19
Jonathan

ビューにスケール変換を適用している場合、その変換はUIViewの transform property を介して(適切に)利用可能になります。 CGAffineTransform docs によると、スケール変換は、変換行列の座標(1,1)と(2,2)でゼロ以外の値を持ちます。したがって、次のようにして、xスケールとyスケールの係数を取得できます。

CGFloat xScale = view.transform.a;
CGFloat yScale = view.transform.d;
45
Tim

これによると source 、このメソッドを使用すると、変換に適用される回転または平行移動に関係なく、スケールが得られます。

func scale(from transform: CGAffineTransform) -> Double {
    return sqrt(Double(transform.a * transform.a + transform.c * transform.c));
}

私はパーティーに遅れていることを知っていますが、私の場合、受け入れられた答えはうまくいきませんでした。

3
Margaret

あなたの答えはすべて私を助けてくれました。皆さん、ありがとうございました!

誰かが興味を持っているなら、ここに私のコードがあります:

#define MAX_SCALE 3
#define MIN_SCALE 0.3

//      PINCH
- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer {

//START
if (recognizer.state == UIGestureRecognizerStateBegan) {
    recognizer.scale = selectedView.transform.a;
}

float scale;

if (recognizer.scale < MIN_SCALE) {
    scale = MIN_SCALE - (MIN_SCALE - recognizer.scale)/4;
}else if (recognizer.scale > MAX_SCALE) {
    scale = MAX_SCALE - (MAX_SCALE - recognizer.scale)/4;
}else {
    scale = recognizer.scale;
}

selectedView.transform = CGAffineTransformMakeScale(scale, scale);

//END
if (recognizer.state == UIGestureRecognizerStateEnded) {
    if (recognizer.scale < MIN_SCALE) {
        scale = MIN_SCALE;
    }

    if (recognizer.scale > MAX_SCALE) {
        scale = MAX_SCALE;
    }

    [UIView animateWithDuration:0.3 animations:^{
        selectedView.transform = CGAffineTransformMakeScale(scale, scale);
    }];
}

}

1
Jonathan

これをチェックしてください....これでは、UIPinchGestureRecognizerを使用して最小および最大ズームスケールを設定する方法を学ぶことができます.... IPinchGestureRecognizerを使用して最小および最大ズームスケールを設定する方法 ==

1
TheTiger

その機能はUIScrollViewとそのzoomScaleプロパティで提供されます。

編集:

現在のスケールを知ることは、変換行列によって与えられます。ご存知のように、スケール値は次のとおりです。

sx, 0,  0
0 , sy, 0
. . .. ,1. 

現在の状態を取得するには、トランスフォームの状態を記録するだけです。ただし、その状態に戻るには、最後の変換の逆を使用するか、単位行列をロードする必要があります。

1
dans3itz

それはcontentScaleFactor参照 )ではありませんか?

0
trojanfoe

CGAffineTransform 変換行列の周りのいくつかの数学を使用して、スケールを計算できます。これは マーガレットのコメント でも言及されています。 Swiftを使用すると、計算されたプロパティを使用して単純な拡張を記述できます。

extension CGAffineTransform {
    var scale: Double {
        return sqrt(Double(a * a + c * c))
    }
}

したがって、後で次のようにscaleで直接CGAffineTransformを呼び出すことで使用できます。

let someViewScale = someView.transform.scale