Что такое GeometryReader в SwiftUI?

Ответ

GeometryReader — это контейнерный view в SwiftUI, который предоставляет своему содержимому информацию о размере и координатах доступного пространства. Он позволяет создавать адаптивные интерфейсы, зависящие от размера родительского контейнера.

Ключевые особенности:

  • Принимает замыкание с параметром типа GeometryProxy.
  • GeometryProxy предоставляет свойства size (доступные размеры) и функцию frame(in:) для определения координат в заданной системе координат.
  • Сам GeometryReader расширяется, чтобы занять все предложенное ему пространство.

Практический пример:

GeometryReader { geometry in
    VStack {
        Text("Доступная ширина: (Int(geometry.size.width))")
        Rectangle()
            .fill(Color.blue)
            .frame(width: geometry.size.width * 0.75, // 75% от ширины родителя
                   height: 100)
    }
}
.frame(height: 200) // GeometryReader займет эту высоту и всю доступную ширину.

Важные замечания:

  • Производительность: Чрезмерное или вложенное использование GeometryReader может негативно сказаться на производительности, так как вызывает частые пересчеты лэйаута.
  • Применение: Полезен для создания кастомных лэйаутов, адаптивных сеток, сложных анимаций и позиционирования элементов относительно границ контейнера.

Ответ 18+ 🔞

А, ну вот, подъехала наша любимая палка о двух концах — GeometryReader! Штука, блядь, мощная, как трактор, но если не умеешь рулить — разъебешь весь интерфейс к хуям собачьим.

Представь себе этакого всевидящего шпиона в мире вьюх. Суёт своему содержимому в руки объект GeometryProxy и такой: «На, мудила, вот тебе все секретные данные: сколько тут места есть (size) и где ты, сука, находишься (frame(in:)). Делай что хошь!». А сам этот читатель, хитрая жопа, расползается на ВСЁ предложенное ему пространство, как масло по горячей сковородке.

На что это похоже на практике? Смотри, вот тебе живой кусок кода, чтоб не быть голословным:

GeometryReader { geometry in // Сюда прилетает наш шпионский прокси
    VStack {
        Text("Ширины тут, блядь: (Int(geometry.size.width))") // Считаем пиксели
        Rectangle()
            .fill(Color.blue)
            .frame(width: geometry.size.width * 0.75, // Берём 75% от ширины родителя!
                   height: 100)
    }
}
.frame(height: 200) // Сам GeometryReader, ёпта, вжух — и растянулся на всю ширину, а высоту вот эту возьмёт.

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

  • Производительность, мать её! Начинающие его, блядь, как конфетку, везде пихают. Вложил один в другой, третий прикрутил — и охуел: интерфейс тормозит, будто по гвоздям ползёт. Он же каждый чих, каждое движение вызывает пересчёт всей геометрии! Используй точечно, будто хирург скальпель, а не как повар половник.
  • Зачем он вообще? Да когда тебе нужно что-то умное, что от размеров зависит. Кастомную сетку слепить, элемент ровно по центру другой хуйни выставить, сложную анимацию, которая от границ отталкивается. Короче, для взрослых игрушек, а не для простых кнопок.

Запомни: это инструмент не для каждого дня, а для особых случаев. Как бензопила — для дерева охуенно, а для бутерброда — пиздец как неудобно и опасно.