Как узнать текущую шкалу UIView?

Как вы находите текущий масштаб (уровень масштабирования) UIView?

Ответы

Ответ 1

Если вы применяете масштабное преобразование к своему представлению, это преобразование будет доступно (достаточно надлежащим образом) через свойство transform UIView. Согласно CGAffineTransform docs, масштабные преобразования будут иметь ненулевые значения в координатах (1,1) и (2,2) в матрице преобразования; вы можете получить свои x- и y-масштабные факторы, выполнив следующие действия:

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

Ответ 2

В соответствии с этим source, использование этого метода дает вам масштаб независимо от поворота или перевода, применяемого для преобразования:

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

Я знаю, что опаздываю на вечеринку, но принятый ответ не работает в моем случае.

Ответ 3

Эта функциональность предоставляется с помощью UIScrollView и свойства zoomScale.

ИЗМЕНИТЬ:

Знание текущего масштаба задается матрицей преобразования. Значения шкалы, как вы знаете, находятся здесь:

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

Чтобы получить текущее состояние, просто запишите состояние преобразования. Однако, чтобы вернуться в это состояние, вам нужно использовать инверсию последнего преобразования или загрузить идентификационную матрицу.

Ответ 5

Все ваши ответы помогли мне. Спасибо всем!

Если кому-то интересно, вот мой код:

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

}

Ответ 6

Разве это не contentScaleFactor (reference)?

Ответ 7

Используя некоторую математику вокруг матрицы преобразования CGAffineTransform, вы можете вычислить масштаб. Это также упоминается в комментарии Маргарет. Swift позволяет вам написать простое расширение с вычисляемым свойством:

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

Итак, позже вы можете использовать, вызвав scale непосредственно на CGAffineTransform, например так:

let someViewScale = someView.transform.scale