Что такое CAShapeLayer в iOS?

«Что такое CAShapeLayer в iOS?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CAShapeLayer — это подкласс CALayer из фреймворка Core Animation, предназначенный для высокопроизводительного отображения векторных фигур, определяемых контуром (CGPath).

Преимущества перед обычной отрисовкой в draw(_:):

  • Аппаратное ускорение: Отрисовка делегируется GPU.
  • Не требует перерисовки: Изменение свойств слоя (например, path, fillColor) автоматически анимируется и перерисовывается.
  • Гибкость: Позволяет легко создавать сложные, анимируемые фигуры.

Основные свойства:

  • path: CGPath? — определяет геометрию фигуры.
  • fillColor: CGColor? — цвет заливки.
  • strokeColor: CGColor? — цвет обводки контура.
  • lineWidth: CGFloat — толщина обводки.
  • lineCap: CAShapeLayerLineCap — стиль конца линии (например, .round).
  • lineDashPattern: [NSNumber]? — шаблон для пунктирной линии.

Пример создания круглого индикатора:

// 1. Создаем контур круга
let circularPath = UIBezierPath(
    arcCenter: view.center,
    radius: 50,
    startAngle: -.pi / 2,
    endAngle: 1.5 * .pi,
    clockwise: true
)

// 2. Создаем и настраиваем CAShapeLayer
let shapeLayer = CAShapeLayer()
shapeLayer.path = circularPath.cgPath
shapeLayer.fillColor = UIColor.clear.cgColor // Прозрачная заливка
shapeLayer.strokeColor = UIColor.systemBlue.cgColor // Цвет обводки
shapeLayer.lineWidth = 8
shapeLayer.lineCap = .round // Закругленные концы
shapeLayer.strokeEnd = 0.0 // Начальное значение (0% заполненности)

// 3. Добавляем слой в иерархию слоев
view.layer.addSublayer(shapeLayer)

// 4. Анимация заполнения (например, для индикатора прогресса)
let animation = CABasicAnimation(keyPath: "strokeEnd")
animation.toValue = 0.75 // Анимируем до 75%
animation.duration = 1.0
shapeLayer.add(animation, forKey: "progressAnimation")
shapeLayer.strokeEnd = 0.75 // Обновляем модель

Типичное применение: Прогресс-бары, кастомные кнопки, анимированные фоны, сложные маски для слоев.