Ответ
Свойство transform — это аффинное (2D) или 3D-преобразование, применяемое к слою (CALayer) или представлению (UIView). Оно модифицирует систему координат элемента для визуальных трансформаций без изменения его фактического фрейма (frame).
Основные типы преобразований:
- Перемещение (Translation):
CGAffineTransform(translationX:y:) - Масштабирование (Scale):
CGAffineTransform(scaleX:y:) - Вращение (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 в коде всё ещё показывает старые координаты. Это пиздец как сбивает с толку, когда пытаешься что-то посчитать.
А делается это всё тремя основными способами, проще некуда:
- Сдвинуть (Translation):
CGAffineTransform(translationX: 50, y: 20). Всё, объект поехал на 50 точек вправо и 20 вниз. Как будто его хуйнули пальцем. - Растянуть/сжать (Scale):
CGAffineTransform(scaleX: 0.8, y: 0.8). Уменьшили до 80%, и он стал, как манда с ушами, сморщенный. - Крутануть (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 — и поехала плавная, как говно по маслу, анимация. Пинч-зум, драг-энд-дроп, вся эта хуйня — всё завязано на нём. Так что учи, сука, это свойство. Без него ты в интерфейсах как без рук, а руки, блядь, из жопы.