Ответ
Да, ручная верстка через прямое задание frame используется, хотя и реже, чем Auto Layout. Это актуально в нескольких сценариях:
Когда это уместно:
- Высокопроизводительная отрисовка: В
drawRect:или при работе сCALayer, где нужен абсолютный контроль над координатами. - Кастомные анимации: Прямое управление
frameилиcenterвнутри блокаUIView.animate. - Очень простые или фиксированные layout: Например, размещение разделителя или фонового view с постоянными отступами.
- Наследие и оптимизация: В старых проектах или для микрооптимизации в критичных к производительности местах (например, в ячейках таблицы со сложной иерархией).
Пример и важные замечания:
let badge = UILabel()
badge.text = "NEW"
badge.textColor = .white
badge.backgroundColor = .red
badge.textAlignment = .center
// Ручная установка frame относительно родителя
badge.frame = CGRect(x: parentView.bounds.width - 50,
y: 10,
width: 40,
height: 20)
parentView.addSubview(badge)
Критические нюансы:
- Координаты
frameзадаются в системе координат родительского view. - При изменении размера родителя (
bounds) или повороте устройстваframeне обновится автоматически. Необходимо пересчитывать вручную (например, вlayoutSubviews()илиviewDidLayoutSubviews()). - Для корректной работы с трансформациями (
transform) используйтеcenterиbounds, а неframe.
Вывод: frame — это низкоуровневый инструмент. Auto Layout и SwiftUI предпочтительны для создания адаптивных интерфейсов, но понимание работы с frame необходимо для глубокой настройки и отладки.
Ответ 18+ 🔞
А, ну вот, классика, блядь! Ручная верстка через этот самый frame — это как на карбюраторной девятке ездить, когда вокруг уже все на автоматах. Вроде и архаизм, ёпта, но в определённых руках — оружие, блядь.
Так когда же этот ручной режим ещё не сдох?
- Когда надо выжать все соки: Внутри
drawRect:или когда сCALayerколдуешь. Тут нужен контроль тотальный, блядь, каждый пиксель на счету. Auto Layout там будет как слон в посудной лавке — только мешать. - Для кастомных плясок с бубном (анимаций): Хочешь view по сложной траектории гонять? Заходи в
UIView.animateи давай напрямуюframeилиcenterдёргай. Чисто, предсказуемо. - Для простых, тупых, как валенок, вещей: Разделитель на одну линию, фоновая подложка, которая никуда не денется. Зачем тут констрейнты городить? Одной строчкой
frameзадал и забыл, в рот меня чих-пых. - Старые проекты и микрооптимизация: Наследие, блядь, такое наследие. Или в ячейке таблицы, где вьюшек дохуя, и каждый миллисекунд на вес золота. Иногда ручной расчёт
frameвlayoutSubviews()ячейки даёт тот самый прирост, который нужен.
Смотри, как это выглядит, на примере:
let badge = UILabel()
badge.text = "NEW"
badge.textColor = .white
badge.backgroundColor = .red
badge.textAlignment = .center
// Всё, магия кончилась. Берём и тупо ставим где сказано.
badge.frame = CGRect(x: parentView.bounds.width - 50,
y: 10,
width: 40,
height: 20)
parentView.addSubview(badge)
А теперь, внимание, ебушки-воробушки, главные подводные грабли:
- Координаты в
frame— это всегда относительно папы, то есть родительского вью. Не перепутай, а то будет твой бейдж где-нибудь в углу экрана торчать. - Родитель изменил размер? Телефон повернули? А твой
frame, сука, ни хуя не обновится. Сидит как вкопанный. Придётся самому, вручную, в том жеlayoutSubviews()всё пересчитывать. Автолейаут бы это сделал за тебя, пидор шерстяной. - Если view крутишь, масштабируешь через
transform— забудь проframe, он там пойдёт вразнос. Работай черезcenterиbounds, это святое.
Итог, блядь: frame — это инструмент для низкоуровневого гончара. Для 95% интерфейсов бери Auto Layout или тот же SwiftUI, не парься. Но если уж полез в дебри производительности или анимаций — без понимания, как эта хуйня работает на пальцах, ты просто обосрёшься.