Ответ
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 // Обновляем модель
Типичное применение: Прогресс-бары, кастомные кнопки, анимированные фоны, сложные маски для слоев.