← Назад к вопросам

Что такое свойство Transform?

1.0 Junior🔥 52 комментариев
#UIKit и верстка

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое свойство Transform?

Transform (трансформация) — это ключевое свойство, доступное у UIView, CALayer и в SwiftUI у View, которое позволяет выполнять аффинные преобразования геометрии элемента в двумерном пространстве. Это мощный инструмент для манипуляций с отображением, не изменяющий фундаментальные свойства фрейма или баундсов. Трансформации выполняются над системой координат слоя (или вью), влияя на все его сабвью, если не указано иное.

Математическая основа

В основе лежит структура CGAffineTransform (Core Graphics), представляющая матрицу 3x3 для 2D-преобразований:

struct CGAffineTransform {
    var a: CGFloat  // Масштабирование по X
    var b: CGFloat  // Сдвиг по Y
    var c: CGFloat  // Сдвиг по X
    var d: CGFloat  // Масштабирование по Y
    var tx: CGFloat // Перевод по X
    var ty: CGFloat // Перевод по Y
}

В iOS преобразования применяются в порядке: Масштаб -> Поворот -> Перевод. Важно помнить, что трансформации не изменяют свойства frame напрямую — они модифицируют center и bounds с преобразованием.

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

  1. Перемещение (Translation):

    // UIKit
    view.transform = CGAffineTransform(translationX: 50, y: 30)
    
    // SwiftUI
    Text("Hello").transformEffect(.init(translationX: 50, y: 30))
    
  2. Масштабирование (Scaling):

    // Увеличение в 2 раза по обеим осям
    view.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
    
    // Зеркальное отражение по горизонтали
    view.transform = CGAffineTransform(scaleX: -1, y: 1)
    
  3. Вращение (Rotation):

    // Поворот на 45 градусов (значение в радианах)
    let radians = CGFloat.pi / 4
    view.transform = CGAffineTransform(rotationAngle: radians)
    
  4. Наклон (Skew/Shear):

    // Создание наклона через модификацию компонентов матрицы
    var transform = CGAffineTransform.identity
    transform.b = 0.5  // Наклон по вертикали
    transform.c = 0.3  // Наклон по горизонтали
    

Комбинирование трансформаций

Преобразования можно комбинировать различными способами:

// Последовательное применение (умножение матриц справа)
let transform = CGAffineTransform.identity
    .translatedBy(x: 100, y: 0)
    .rotated(by: .pi / 2)
    .scaledBy(x: 0.5, y: 2.0)

// Конкатенация (умножение матриц)
let scale = CGAffineTransform(scaleX: 2, y: 2)
let rotate = CGAffineTransform(rotationAngle: .pi / 4)
view.transform = scale.concatenating(rotate)

// SwiftUI использует модификаторы
Rectangle()
    .rotationEffect(.degrees(45))
    .scaleEffect(1.5)
    .offset(x: 50, y: 20)

Ключевые особенности и применение

  • Производительность: Трансформации выполняются на GPU, что делает их высокоэффективными для анимаций.
  • Иерархическое наследование: Дочерние вью наследуют трансформацию родителя.
  • Anchor Point: Точка привязки (по умолчанию center) определяет центр преобразований. Её изменение через layer.anchorPoint смещает центр трансформаций.
  • Инверсия: Можно получить обратное преобразование через transform.inverted().
  • 3D-трансформации: Для более сложных эффектов используется CATransform3D с осью Z:
    var transform = CATransform3DIdentity
    transform.m34 = -1.0 / 500  // Перспектива
    transform = CATransform3DRotate(transform, .pi / 4, 1, 0, 0)
    view.layer.transform = transform
    

Практические примеры использования

  1. Анимации интерфейса:

    UIView.animate(withDuration: 0.5) {
        button.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
    }
    
  2. Кастомные переходы между контроллерами:

    // В UIViewControllerTransitioningDelegate
    toView.transform = CGAffineTransform(translationX: 0, y: UIScreen.main.bounds.height)
    UIView.animate(withDuration: 0.3) {
        toView.transform = .identity
    }
    
  3. Параллакс-эффекты:

    // При скролле применяем разное смещение для слоёв
    foreground.transform = CGAffineTransform(translationX: offsetX * 0.5, y: 0)
    background.transform = CGAffineTransform(translationX: offsetX * 0.2, y: 0)
    
  4. Динамические интерфейсы:

    // Создание радиального меню
    for (index, button) in buttons.enumerated() {
        let angle = CGFloat(index) * (2 * .pi / CGFloat(buttons.count))
        button.transform = CGAffineTransform(rotationAngle: angle)
    }
    

Отличия от других свойств

Важно отличать transform от:

  • frame — определяет позицию и размер в системе координат супервью
  • bounds — определяет внутреннюю систему координат
  • center — определяет центр позиции

При применении трансформации frame становится неопределённым (возвращает CGRect.zero при нетривиальной трансформации), а для позиционирования используется center.

Особенности в SwiftUI

В SwiftUI трансформации представлены как модификаторы:

Text("Transform")
    .rotationEffect(.degrees(30))
    .scaleEffect(1.5, anchor: .topLeading)
    .transformEffect(.init(translationX: 20, y: 10))

Transform — фундаментальный инструмент в арсенале iOS-разработчика, позволяющий создавать сложные визуальные эффекты, плавные анимации и динамические интерфейсы с минимальными затратами ресурсов. Понимание его работы на уровне матричных операций открывает возможности для создания профессиональных кастомных взаимодействий, недоступных при использовании стандартных анимаций свойств фрейма.

Что такое свойство Transform? | PrepBro