Приходилось ли использовать ручную верстку через frame в iOS?

Ответ

Да, ручная верстка через прямое задание frame используется, хотя и реже, чем Auto Layout. Это актуально в нескольких сценариях:

Когда это уместно:

  1. Высокопроизводительная отрисовка: В drawRect: или при работе с CALayer, где нужен абсолютный контроль над координатами.
  2. Кастомные анимации: Прямое управление frame или center внутри блока UIView.animate.
  3. Очень простые или фиксированные layout: Например, размещение разделителя или фонового view с постоянными отступами.
  4. Наследие и оптимизация: В старых проектах или для микрооптимизации в критичных к производительности местах (например, в ячейках таблицы со сложной иерархией).

Пример и важные замечания:

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

Так когда же этот ручной режим ещё не сдох?

  1. Когда надо выжать все соки: Внутри drawRect: или когда с CALayer колдуешь. Тут нужен контроль тотальный, блядь, каждый пиксель на счету. Auto Layout там будет как слон в посудной лавке — только мешать.
  2. Для кастомных плясок с бубном (анимаций): Хочешь view по сложной траектории гонять? Заходи в UIView.animate и давай напрямую frame или center дёргай. Чисто, предсказуемо.
  3. Для простых, тупых, как валенок, вещей: Разделитель на одну линию, фоновая подложка, которая никуда не денется. Зачем тут констрейнты городить? Одной строчкой frame задал и забыл, в рот меня чих-пых.
  4. Старые проекты и микрооптимизация: Наследие, блядь, такое наследие. Или в ячейке таблицы, где вьюшек дохуя, и каждый миллисекунд на вес золота. Иногда ручной расчёт 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, не парься. Но если уж полез в дебри производительности или анимаций — без понимания, как эта хуйня работает на пальцах, ты просто обосрёшься.