Можно ли отрисовать UIView без использования CALayer?

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

Ответ

Да, можно, но с важными оговорками. Каждый UIView по умолчанию имеет связанный CALayer (view.layer). Однако можно выполнить кастомную отрисовку, минуя этот слой, переопределив метод draw(_:).

Пример ручной отрисовки в Core Graphics:

class CustomView: UIView {
    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else { return }
        // Рисуем напрямую в графический контекст
        context.setFillColor(UIColor.red.cgColor)
        context.fill(CGRect(x: 20, y: 20, width: 100, height: 100))
    }
}

Ключевые моменты:

  • Слой не исключается: Базовый CALayer все равно существует, но вы рисуете поверх него в контексте.
  • Производительность: Ручная отрисовка в draw(_:) может быть менее эффективна, чем использование оптимизированных CALayer и его свойств (например, backgroundColor, cornerRadius).
  • Анимации: Реализация анимаций и трансформаций через draw(_:) сложна. Для анимаций предпочтительнее манипулировать свойствами слоя или использовать UIView-анимации.