Получение «масштаба» из CATransform3D

Я создаю приложение для iPad и хочу сообщить пользователю текущий размер представления. Раньше я делал это, вычисляя масштаб CGAffineTransform и умножая xScale на ширину (соответствующего представления) и yScale на высоту. Я хотел бы продолжать это делать, но я больше не занимаюсь 2D-преобразованиями и не знаю, какое уравнение использовать для извлечения информации о масштабе из CATransform3D.

Вы можете помочь?


person Allyn    schedule 14.12.2010    source источник


Ответы (3)


Чтобы получить текущий масштаб слоя, вы просто выполняете valueForKeyPath: на слое:

CGFloat currentScale = [[layer valueForKeyPath: @"transform.scale"] floatValue];

Другие ключи можно найти в Руководство по программированию Apple Core Animation

person jlalvarez18    schedule 22.08.2011
comment
Забавно, всегда возвращает nil [[self PresentationLayer] valueForKey:@transform.scale] - person Ben Affleck; 01.11.2013
comment
Энди, это потому, что ты звонишь valueForKey, а не valueForKeyPath. - person Mark; 20.05.2017

Я не знаком с API, но CATransform3D выглядит как обычная матрица преобразования 4x4 для выполнения трехмерных преобразований.

Предполагая, что он представляет собой не что иное, как комбинацию масштаба, поворота и перемещения, коэффициенты масштабирования можно извлечь, вычислив величины строк или столбцов верхнего левого 3x3 в зависимости от того, является ли CATransform3D основной строкой или столбцом соответственно.

Например, если это основной ряд, масштаб в направлении x представляет собой квадратный корень из ( m11 * m11 ) + ( m12 * m12 ) + ( m13 * m13 ). Масштабы y и z также будут величинами второй и третьей строк.

Из документации для CATransform3DMakeTranslation похоже, что CATransform3D действительно является главным по строке.

person Troubadour    schedule 14.12.2010

Вот ответ на обновление для swift 4+

guard let currentScaleX = view.layer.value(forKeyPath: "transform.scale.x") as? CGFloat {
    return 
}
print ("the scale x is \(currentScaleX)")
guard let currentScaleY = view.layer.value(forKeyPath: "transform.scale.y") as? CGFloat {
    return 
}
print ("the scale y is \(currentScaleY)")
person Juan Carlos Ospina Gonzalez    schedule 04.11.2019