Можно ли построить UI в iOS, используя только CALayer, без UIView?

Ответ

Технически да, но это крайне не рекомендуется для создания полноценного интерфейса. 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, а не эти костыли. Не усложняй себе жизнь, мудила.