UIView
の現在のスケール(ズームレベル)をどのように見つけますか?
ビューにスケール変換を適用している場合、その変換はUIViewの transform
property を介して(適切に)利用可能になります。 CGAffineTransform docs によると、スケール変換は、変換行列の座標(1,1)と(2,2)でゼロ以外の値を持ちます。したがって、次のようにして、xスケールとyスケールの係数を取得できます。
CGFloat xScale = view.transform.a;
CGFloat yScale = view.transform.d;
これによると source 、このメソッドを使用すると、変換に適用される回転または平行移動に関係なく、スケールが得られます。
func scale(from transform: CGAffineTransform) -> Double {
return sqrt(Double(transform.a * transform.a + transform.c * transform.c));
}
私はパーティーに遅れていることを知っていますが、私の場合、受け入れられた答えはうまくいきませんでした。
あなたの答えはすべて私を助けてくれました。皆さん、ありがとうございました!
誰かが興味を持っているなら、ここに私のコードがあります:
#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);
}];
}
}
これをチェックしてください....これでは、UIPinchGestureRecognizer
を使用して最小および最大ズームスケールを設定する方法を学ぶことができます.... IPinchGestureRecognizerを使用して最小および最大ズームスケールを設定する方法 ==
その機能はUIScrollViewとそのzoomScaleプロパティで提供されます。
編集:
現在のスケールを知ることは、変換行列によって与えられます。ご存知のように、スケール値は次のとおりです。
sx, 0, 0
0 , sy, 0
. . .. ,1.
現在の状態を取得するには、トランスフォームの状態を記録するだけです。ただし、その状態に戻るには、最後の変換の逆を使用するか、単位行列をロードする必要があります。
それはcontentScaleFactor
( 参照 )ではありませんか?
CGAffineTransform 変換行列の周りのいくつかの数学を使用して、スケールを計算できます。これは マーガレットのコメント でも言及されています。 Swiftを使用すると、計算されたプロパティを使用して単純な拡張を記述できます。
extension CGAffineTransform {
var scale: Double {
return sqrt(Double(a * a + c * c))
}
}
したがって、後で次のようにscale
で直接CGAffineTransform
を呼び出すことで使用できます。
let someViewScale = someView.transform.scale