如何找到UIView
的当前比例(缩放级别)?
答案 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)
不是contentScaleFactor
(reference)吗?
答案 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