如何知道UIView的当前规模?

时间:2012-08-20 14:56:16

标签: ios objective-c uiview zoom scale

如何找到UIView的当前比例(缩放级别)?

7 个答案:

答案 0 :(得分:44)

如果您正在对视图应用缩放变换,则该变换将通过UIView上的transform property可用(足够适当)。根据{{​​3}},尺度变换在变换矩阵中的坐标(1,1)和(2,2)处将具有非零值;因此,您可以通过以下方式获得x和y比例因子:

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

答案 1 :(得分:3)

根据此source,使用此方法可为您提供比例,无论应用于转换的旋转或平移如何:

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

我知道我迟到了,但接受的答案对我来说并不起作用。

答案 2 :(得分:1)

该功能随UIScrollView及其zoomScale属性一起提供。

编辑:

了解当前比例由变换矩阵给出。如您所知,比例值如下:

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

要获取当前状态,只需记录变换的状态。但是,要返回到该状态,您需要使用上一次转换的逆或加载单位矩阵。

答案 3 :(得分:1)

选中它会对您有所帮助....在此,您可以了解如何使用UIPinchGestureRecognizer设置最小和最大缩放比例.... How to set minimum and maximum zoom scale using UIPinchGestureRecognizer

答案 4 :(得分:1)

你的所有答案对我有帮助。 谢谢大家!

如果有人感兴趣,请点击我的代码:

#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);
    }];
}

}

答案 5 :(得分:0)

不是contentScaleFactorreference)吗?

答案 6 :(得分:0)

使用围绕CGAffineTransform转换矩阵的一些数学运算,可以计算出比例。 Margaret's comment中也提到了这一点。 Swift可让您编写具有计算属性的简单扩展:

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

因此,稍后您可以通过直接在scale上调用CGAffineTransform来使用,就像这样:

let someViewScale = someView.transform.scale