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

Ответ

Да, можно, но с важными оговорками. Каждый 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-анимации.

Ответ 18+ 🔞

Ну, слушай, история-то интересная. Вроде как можно, а вроде как и нет, понимаешь? Каждый твой UIView по жизни привязан к своему CALayer как к тени, это view.layer. Его не оторвать, он там всегда, как задний фон в плохом кино. Но! Есть же лазейка, блядь! Можно взять и нарисовать всё самому, внаглую, перепрыгнув через этот слой, если переопределить метод draw(_:). Чисто по-пацански, кисточкой по холсту.

Вот смотри, как это выглядит в коде, если делать по-брутальному:

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(_:) — это часто медленнее, чем просто тыкнуть в свойства слоя. Захочешь скруглить угол — проще layer.cornerRadius выставить, чем городить огород с кривыми Безье. Оптимизация, блядь, где твои крылья?
  • Анимации — отдельная песня: Попробуй тут что-нибудь плавно подвинуть или покрутить, используя только draw(_:). Это будет пиздец, честно. Для всего танцующего со свистом лучше юзать либо анимации UIView, либо напрямую дёргать свойства этого самого слоя, который ты хотел обойти. Ирония, блядь, в рот меня чих-пых!