Что такое свойство `transform` в UIKit/Core Animation?

Ответ

Свойство transform — это аффинное (2D) или 3D-преобразование, применяемое к слою (CALayer) или представлению (UIView). Оно модифицирует систему координат элемента для визуальных трансформаций без изменения его фактического фрейма (frame).

Основные типы преобразований:

  1. Перемещение (Translation): CGAffineTransform(translationX:y:)
  2. Масштабирование (Scale): CGAffineTransform(scaleX:y:)
  3. Вращение (Rotation): CGAffineTransform(rotationAngle:)

Пример комбинирования 2D-трансформаций:

// Создаем и применяем несколько преобразований
let scaleTransform = CGAffineTransform(scaleX: 0.8, y: 0.8)
let rotateTransform = CGAffineTransform(rotationAngle: .pi / 6) // 30 градусов
let translateTransform = CGAffineTransform(translationX: 50, y: 20)

// Объединяем: сначала масштаб, потом поворот, потом сдвиг
myView.transform = scaleTransform.concatenating(rotateTransform).concatenating(translateTransform)

Пример 3D-трансформации (с перспективой):

var transform = CATransform3DIdentity
transform.m34 = -1.0 / 500.0 // Задает перспективу (точку схода)
transform = CATransform3DRotate(transform, .pi / 4, 1, 0, 0) // Поворот на 45° по оси X
myView.layer.transform = transform

Ключевые особенности:

  • Производительность: Аппаратно ускоряется Core Animation.
  • Анимация: Свойство transform легко анимируется с помощью UIView.animate или CABasicAnimation.
  • Интерактивность: Часто используется для жестов (например, масштабирование пальцами).

Ответ 18+ 🔞

А, ну вот, опять про этот ваш transform, блядь! Сидишь, смотришь на интерфейс — вроде ровно стоит кнопка, а на самом деле у неё там внутри, сука, целая геометрическая революция происходит, ёпта!

Смотри, чтобы ты не обосрался с этими трансформациями, как я в первый раз. Представь, что у тебя есть UIView — ну, обычная хуйня, квадратная. И есть у него свойство frame, которое говорит, где он стоит на экране. Так вот, transform — это такой, блядь, хитрожопый трюк. Он берёт этот вью, и начинает его координатную систему ебать со всех сторон — крутить, масштабировать, двигать. А frame при этом, внимание, остаётся нахуй неизменным! Вот в чём прикол! Вью физически на экране сдвинулось, а его frame в коде всё ещё показывает старые координаты. Это пиздец как сбивает с толку, когда пытаешься что-то посчитать.

А делается это всё тремя основными способами, проще некуда:

  1. Сдвинуть (Translation): CGAffineTransform(translationX: 50, y: 20). Всё, объект поехал на 50 точек вправо и 20 вниз. Как будто его хуйнули пальцем.
  2. Растянуть/сжать (Scale): CGAffineTransform(scaleX: 0.8, y: 0.8). Уменьшили до 80%, и он стал, как манда с ушами, сморщенный.
  3. Крутануть (Rotation): CGAffineTransform(rotationAngle: .pi / 6). Повернули на 30 градусов (π/6, блядь, математика, ебать её в сраку). Теперь он стоит криво, но довольный.

А если хочешь всё и сразу — хуяк-хуяк и concatenating, как в этом примере:

// Создаем и применяем несколько преобразований
let scaleTransform = CGAffineTransform(scaleX: 0.8, y: 0.8)
let rotateTransform = CGAffineTransform(rotationAngle: .pi / 6) // 30 градусов
let translateTransform = CGAffineTransform(translationX: 50, y: 20)

// Объединяем: сначала масштаб, потом поворот, потом сдвиг
myView.transform = scaleTransform.concatenating(rotateTransform).concatenating(translateTransform)

Получится объект, который уменьшили, потом наклонили, а потом отодвинули в сторону. Красота, блядь!

А если тебе 2D-плоскости мало и хочется объёма, как в кино, то добро пожаловать в 3D, через CALayer. Там уже можно поиграть с перспективой:

var transform = CATransform3DIdentity
transform.m34 = -1.0 / 500.0 // Задает перспективу (точку схода)
transform = CATransform3DRotate(transform, .pi / 4, 1, 0, 0) // Поворот на 45° по оси X
myView.layer.transform = transform

Эта строчка m34 — она, сука, магическая. Без неё поворот будет просто плоским, как доска. А с ней появится эта самая перспектива, объём, когда ближний край больше, а дальний меньше. Чем число в знаменателе меньше (по модулю), тем сильнее эффект "рыбьего глаза", овердохуища искажение.

И главная прелесть всего этого цирка в том, что оно, блядь, аппаратно ускоряется. То есть анимировать это — одно удовольствие. Завернул изменение transform в UIView.animate — и поехала плавная, как говно по маслу, анимация. Пинч-зум, драг-энд-дроп, вся эта хуйня — всё завязано на нём. Так что учи, сука, это свойство. Без него ты в интерфейсах как без рук, а руки, блядь, из жопы.