Можно ли создать приложение полностью на слоях без UIView
Что проверяют
Понимаете ли вы, как устроена пара UIView и CALayer: вью это обёртка над слоем, которая добавляет обработку событий, раскладку и доступность. Ответ «да, конечно» без оговорок показывает, что в графику вы не заглядывали.
Как отвечать
Совсем без UIView приложение не собрать: содержимое попадает на экран через UIWindow, а это подкласс UIView. Но всё остальное действительно можно построить на слоях внутри одного хостящего вью, и для графики так и делают: CAShapeLayer, CAGradientLayer, CATextLayer, CAEmitterLayer.
Что при этом теряется и что придётся писать самому:
- касания: у слоёв нет цепочки
UIResponderи распознавателей жестов, попадание считается вручную черезhitTestс конвертацией координат; - раскладка: констрейнтов у слоя нет, позиции пересчитываются в
layoutSublayers; - доступность: VoiceOver видит вью, а не слои, экран становится нечитаемым;
- ввод текста, прокрутка, таблицы.
Выигрыш стоит формулировать честно: рисует в обоих случаях один и тот же слой, экономия идёт на объектах и обвязке и заметна на сотнях и тысячах элементов.
Где спотыкаются
Заявляют, что слои быстрее вью, и не могут объяснить, за счёт чего. Отрисовка одна и та же, разница в накладных расходах на объекты, а не в скорости композиции.
Забывают про contentsScale. Созданный вручную слой по умолчанию рисует в масштабе один к одному, и на экране с высокой плотностью текст и фигуры выглядят размытыми. Масштаб берут у экрана или у окна.
Не учитывают разницу в анимациях. У отдельно созданного слоя изменение position или bounds запускает неявную анимацию, у слоя вью она выключена, и «само поехало» на таком экране ловят долго. Разумная граница: каркас на вью, слои точечно под сложную графику.