Ответ
Технически да, но это крайне не рекомендуется для создания полноценного интерфейса. CALayer — это низкоуровневый объект Core Animation для отрисовки и анимации.
Проблемы при использовании только CALayer:
- Отсутствие обработки событий: Слои не отвечают на касания (tap, swipe). Придется реализовывать распознавание жестов вручную.
- Нет высокоуровневых компонентов: Придется вручную рисовать текст (
CATextLayer), изображения (contents), скругления, тени. - Сложности с layout: Нет Auto Layout. Позиционирование через
frameилиboundsвручную.
Пример создания простой "кнопки" на CALayer:
let buttonLayer = CALayer()
buttonLayer.frame = CGRect(x: 20, y: 20, width: 100, height: 44)
buttonLayer.backgroundColor = UIColor.systemBlue.cgColor
buttonLayer.cornerRadius = 8
buttonLayer.borderWidth = 1
buttonLayer.borderColor = UIColor.darkGray.cgColor
let textLayer = CATextLayer()
textLayer.string = "Tap"
textLayer.frame = buttonLayer.bounds
buttonLayer.addSublayer(textLayer)
view.layer.addSublayer(buttonLayer)
Когда это может быть оправдано? Для кастомной, высокопроизводительной анимации или отрисовки. В 99% случаев используйте UIView, который инкапсулирует слой и предоставляет удобный API.
Ответ 18+ 🔞
А, слушай, ну технически-то да, конечно. Но это будет такой высер, что мама не горюй. Это как пытаться построить дом, используя только кирпичи и игнорируя существование стен, окон и дверей. CALayer — это тот самый голый кирпич, низкоуровневая железяка из Core Animation для отрисовки и анимации.
Вот с каким пиздецом ты столкнёшься, если пойдёшь этим путём:
- События? Не, не слышал. Слои на касания (тап, свайп) не реагируют в принципе. Придётся самому, блядь, городить распознаватели жестов, как последний извращенец.
- Готовых компонентов — ноль ебать. Хочешь текст? Рисуй через
CATextLayer. Картинку? Ковыряйся сcontents. Скругления, тени — всё руками, в рот меня чих-пых.UIButtonс его состояниями отдыхает. - Layout превратится в ад. Никакого Auto Layout, только хардкор, только
frameиbounds, которые надо высчитывать самому, как в каменном веке.
Ну ладно, вот тебе пример, как бы выглядела "кнопка" из каменного века, на чистом CALayer:
let buttonLayer = CALayer()
buttonLayer.frame = CGRect(x: 20, y: 20, width: 100, height: 44)
buttonLayer.backgroundColor = UIColor.systemBlue.cgColor
buttonLayer.cornerRadius = 8
buttonLayer.borderWidth = 1
buttonLayer.borderColor = UIColor.darkGray.cgColor
let textLayer = CATextLayer()
textLayer.string = "Tap"
textLayer.frame = buttonLayer.bounds
buttonLayer.addSublayer(textLayer)
view.layer.addSublayer(buttonLayer)
Видишь этот ужас? И это ещё она не кликается! Просто цветной прямоугольник с буковками.
Так когда же это хоть немного оправдано? Ну, может, если ты пишешь какую-то ебучую кастомную анимацию, где каждый пиксель на счету, или рисуешь что-то супер-производительное. Но в остальных 99% случаев, ёпта, бери UIView — он этот слой внутри себя уже содержит и даёт тебе нормальный, человеческий API, а не эти костыли. Не усложняй себе жизнь, мудила.