Какие преимущества и недостатки у ручной верстки через frame в iOS?

Ответ

Преимущества:

  • Производительность и простота: Прямое присвоение CGRect не требует вычислительно дорогого процесса разрешения констрейнтов (layout pass).
  • Полный контроль: Точное управление позицией и размером, что идеально для кастомных, нестандартных анимаций.
  • Прозрачность: Значения origin и size заданы явно, что упрощает понимание и отладку.
  • Минимальный оверхед: Отсутствие дополнительных объектов (NSLayoutConstraint) и связанных с ними вычислений.

Недостатки:

  • Отсутствие адаптивности: Необходимо вручную пересчитывать фреймы для разных размеров экранов, ориентаций и контента.
  • Трудоемкость поддержки: Любое изменение в дизайне или добавление нового размера экрана требует ручных правок во многих местах кода.
  • Абсолютные координаты: Нет встроенной поддержки относительного позиционирования (например, "растянуть по ширине родителя").
  • Поворот устройства: Требуется ручная обработка изменений bounds в методах вроде viewWillLayoutSubviews().

Пример:

// Просто, быстро, но абсолютно не адаптивно
view.frame = CGRect(x: 20, y: 100, width: 200, height: 50)

Ответ 18+ 🔞

А, слушай, вот эта ваша хвалёная ручная расстановка фреймов! Ну, типа, классика жанра, старый добрый способ, когда ты сам, как бог, указываешь каждому виду его священные координаты. Прям как в старые добрые времена, когда интерфейсы рисовали в Interface Builder'е мышкой, блядь.

Что тут, сука, хорошо, а что — пиздец как плохо:

Плюсы, их, блядь, раз-два и обчёлся:

  • Быстро и без мозгоёбства: Ты просто пишешь CGRect(x: 20, y: 100, width: 200, height: 50), и система, не раздумывая, ставит вид именно туда. Никаких этих ваших констрейнтов, которые надо решать, как систему уравнений, блядь. Просто хуяк — и готово. Для анимаций, где надо прыгать по пикселям, — вообще идеально, ёпта.
  • Ты тут главный: Хочешь поставить кнопку ровно на 3.14 пикселя левее — пожалуйста. Полный контроль, как у сапёра с миноискателем. Всё прозрачно: origin и size лежат перед тобой, как на ладони.
  • Лёгкий, как пёрышко: Никаких лишних объектов констрейнтов в памяти не болтается, система не тратит время на их расчёты. Минимальный оверхед, чистая математика.

А теперь, блядь, ложка дёгтя размером с лопату:

  • Адаптивность? Не, не слышал: Это главная, блядь, проблема. Ты написал width: 200 для iPhone 8. А потом приходит заказчик и говорит: "А на iPad'е чтобы было красиво". И ты сидишь, блядь, и высчитываешь: "Так, ширина экрана 1024, отнять 20 пикселей слева, 20 справа...". А потом приходит iPhone SE 1-го поколения, и всё едет к ебеням, в рот меня чих-пых!
  • Поддержка — адский труд: Захотел дизайнер передвинуть лейбл на 5 пикселей вниз. А у тебя этот лейбл в десяти местах кода упомянут, и в каждом нужно менять y. Пиздец, а не работа. Добавить поддержку новой ориентации экрана? Да ты издеваешься!
  • Всё абсолютно: Нет тут никакого "растянись по ширине родителя" или "встань по центру". Всё, блядь, вручную. Хочешь центрировать — готовь калькулятор: (parentWidth - childWidth) / 2. Ёперный театр!
  • Поворот устройства — отдельная песня: Тебе самому, вручную, в методах вроде viewWillLayoutSubviews() нужно ловить момент, когда bounds поменялись, и заново, блядь, всё пересчитывать и переставлять. Удовольствие ниже плинтуса.

Короче, пример, на котором всё видно:

// Сделано. Быстро. Но если экран поменяется — вид останется тут, как памятник, и будет смотреться как хуй в пальто.
view.frame = CGRect(x: 20, y: 100, width: 200, height: 50)

Вот и думай теперь, нужна тебе эта скорость и контроль, или же, блядь, спокойная жизнь с адаптивными констрейнтами.