Какой компонент UIView отвечает за низкоуровневую отрисовку?

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

Ответ

За аппаратно-ускоренную визуализацию UIView отвечает его CALayer (объект Core Animation Layer). UIView выступает как контроллер, управляющий контентом и взаимодействием, а CALayer — как модель, отвечающая за растровые данные и их отрисовку на GPU.

Механизмы отрисовки:

  1. Автоматическая отрисовка (рекомендуется): Установка свойств слоя (backgroundColor, cornerRadius, border). Изменения анимируемы и эффективны.

    view.layer.cornerRadius = 8
    view.layer.borderWidth = 1
    view.layer.borderColor = UIColor.systemBlue.cgColor
  2. Кастомная отрисовка через draw(_:): Переопределите для использования Core Graphics. Система вызывает этот метод, когда нужно обновить растровое представление слоя.

    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else { return }
        // Рисование в контексте...
        context.setFillColor(UIColor.red.cgColor)
        context.fillEllipse(in: rect.insetBy(dx: 5, dy: 5))
    }
    // Запрос на перерисовку:
    view.setNeedsDisplay()
  3. Использование CAShapeLayer: Оптимальный способ для векторной графики (пути, маски).

    let shapeLayer = CAShapeLayer()
    shapeLayer.path = UIBezierPath(roundedRect: bounds, cornerRadius: 10).cgPath
    shapeLayer.fillColor = UIColor.green.cgColor
    view.layer.addSublayer(shapeLayer)

Важно: draw(_:) выполняется на CPU и может быть дорогим. Для сложной или анимируемой графики предпочтительнее использовать CALayer и его сабклассы.