Ответ
Да, можно, но с важными оговорками. Каждый 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, либо напрямую дёргать свойства этого самого слоя, который ты хотел обойти. Ирония, блядь, в рот меня чих-пых!