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

Какие классы существуют у CALayer?

1.0 Junior🔥 121 комментариев
#UIKit и верстка#Анимации и графика

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Классы CALayer и их иерархия

CALayer — это низкоуровневый класс Core Animation, который отвечает за визуализацию содержимого и анимацию. В Core Animation существует иерархия классов, которые наследуются от базового CALayer.

Базовый класс CALayer

let layer = CALayer()
layer.backgroundColor = UIColor.blue.cgColor
layer.cornerRadius = 10
layer.shadowOpacity = 0.5

CALayer — основа всех остальных типов слоёв. Используется для:

  • Базовой визуализации
  • Применения трансформаций
  • Управления непрозрачностью
  • Установки тени и границ

Основные подклассы CALayer

CAShapeLayer:

let shapeLayer = CAShapeLayer()
let path = UIBezierPath(arcCenter: CGPoint(x: 100, y: 100),
                        radius: 50,
                        startAngle: 0,
                        endAngle: CGFloat.pi * 2,
                        clockwise: true)
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
  • Рисует геометрические фигуры и пути
  • Использует UIBezierPath
  • Экономнее, чем рисование в drawRect

CATextLayer:

let textLayer = CATextLayer()
textLayer.string = "Hello World"
textLayer.fontSize = 18
textLayer.foregroundColor = UIColor.black.cgColor
textLayer.alignmentMode = .center
  • Отображает текст
  • Быстрее, чем UILabel в некоторых случаях
  • Не поддерживает всё форматирование UILabel

CAGradientLayer:

let gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 1)
  • Рисует градиенты (линейные и радиальные)
  • Легко менять цвета и направление
  • Используется для красивых фонов

CAReplicatorLayer:

let replicatorLayer = CAReplicatorLayer()
replicatorLayer.instanceCount = 5
replicatorLayer.instanceDelay = 0.1
let dot = CAShapeLayer()
replicatorLayer.addSublayer(dot)
  • Создаёт копии содержимого с трансформацией
  • Полезна для анимаций с множеством повторений (Loading indicators)

CATransformLayer:

let transformLayer = CATransformLayer()
transformLayer.transform = CATransform3DMakeRotation(CGFloat.pi / 4, 0, 1, 0)
  • Используется для 3D трансформаций
  • Не имеет собственного контента для рисования
  • Просто позволяет применить трансформацию к сублайерам

CAEmitterLayer:

let emitterLayer = CAEmitterLayer()
emitterLayer.emitterCells = [emitterCell]
emitterLayer.birthRate = 1.0
  • Создаёт эффекты частиц (снег, дождь, конфетти)
  • Очень эффективна для сложных анимаций
  • Используется в играх и спецэффектах

CATiledLayer:

let tiledLayer = CATiledLayer()
tiledLayer.tileSize = CGSize(width: 256, height: 256)
tiledLayer.drawsAsynchronously = true
  • Рендерит большие содержимое по плиткам
  • Оптимальна для больших изображений и карт
  • Асинхронный рендеринг

CAScrollLayer:

let scrollLayer = CAScrollLayer()
scrollLayer.scrollToPoint(CGPoint(x: 100, y: 200))
  • Позволяет прокручивать содержимое
  • Низкоуровневая альтернатива UIScrollView

CAEAGLLayer / CAMetalLayer:

let metalLayer = CAMetalLayer()
metalLayer.device = MTLCreateSystemDefaultDevice()
  • Для графики с OpenGL ES / Metal
  • Используется в играх и приложениях с высокопроизводительной графикой

Практический пример: комбинирование слоёв

let containerLayer = CALayer()

// Добавляем градиент
let gradient = CAGradientLayer()
gradient.colors = [UIColor.purple.cgColor, UIColor.blue.cgColor]
containerLayer.addSublayer(gradient)

// Добавляем форму
let shape = CAShapeLayer()
shape.strokeColor = UIColor.white.cgColor
containerLayer.addSublayer(shape)

// Добавляем текст
let text = CATextLayer()
text.string = "Beautiful UI"
containerLayer.addSublayer(text)

Ключевые принципы

✅ Используй специализированные слои для оптимальной производительности ✅ CAShapeLayer для рисования векторных фигур ✅ CAGradientLayer для фонов ✅ CAEmitterLayer для частиц ❌ Не рисуй сложную графику в базовом CALayer — используй CAShapeLayer

Каждый класс CALayer оптимизирован для определённой задачи. Выбор правильного класса улучшает производительность приложения.