Создание собственного layout в SwiftUI (iOS 16+) требует соответствия протоколу Layout и реализации двух обязательных методов.
sizeThatFits(proposal:subviews:cache:) — вычисляет и возвращает размер, необходимый твоему layout, учитывая предложенный размерplaceSubviews(in:proposal:subviews:cache:) — позиционирует каждое дочернее представление в доступные границыstruct MyCustomLayout: Layout {
func sizeThatFits(proposal: ProposedViewSize,
subviews: Subviews,
cache: inout ()) -> CGSize {
// Return required size
}
func placeSubviews(in bounds: CGRect,
proposal: ProposedViewSize,
subviews: Subviews,
cache: inout ()) {
// Position each subview
}
}
subviews предоставляет доступ к предпочтениям размеров каждого дочернего представления, позволяя тебе запросить идеальные или минимальные размеры перед их размещениемcache можно использовать для хранения промежуточных вычислений и избежания лишних пересчётов во время проходов layoutsubview.place(at:anchor:proposal:) внутри placeSubviews для позиционирования отдельных представленийHStack, VStack или ZStackMyCustomLayout {
Text("Item 1")
Text("Item 2")
}
Этот подход даёт тебе полный контроль над измерением и размещением, что делает его рекомендуемым решением для сложных или нестандартных расположений представлений в iOS 16 и новее.
Метод sizeThatFits должен возвращать точный размер, который будет использован при раскладке, и этот размер не может быть изменён методом placeSubviews.
Новый — ещё не проверен сообществом
Вы