Как узнать текущую шкалу 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.
Чтобы получить текущее состояние, просто запишите состояние преобразования. Однако, чтобы вернуться в это состояние, вам нужно использовать инверсию последнего преобразования или загрузить идентификационную матрицу.
Ответ 4
Проверьте это, это поможет вам.... В этом вы можете узнать, как установить минимальную и максимальную масштабную шкалу, используя UIPinchGestureRecognizer
.... Как установить минимальное и максимальное масштаб масштаба с использованием UIPinchGestureRecognizer
Ответ 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