Проблема
Я получаю сообщение о том, что "Неверный размер кадра (отрицательный или неконечный)".
struct CellStyle: ViewModifier { func body(content: Content) -> some View { content .frame(width: .infinity, height: 56, alignment: .center) .padding(.horizontal, 16) } }
Код работает нормально, и мне кажется, что он делает то, что должен, поэтому я не понимаю, почему у меня возникает проблема с потоком. Почему код будет работать без конечной ширины/высоты, что противоречит документам Apple? (см. раздел «Читать» ниже)
Исправление
Этот код отлично решает проблему, но мне все же хотелось бы понять, почему предыдущий код не дает сбоев или ошибок.
struct CellStyle: ViewModifier { func body(content: Content) -> some View { content .frame(height: 56, alignment: .center) .frame(maxWidth: .infinity) .padding(.horizontal, 16) } }
Насколько я могу судить, у меня возникает проблема с потоком, потому что я говорю .frame
, что мне нужна неконечная ширина, а ему нужна конечная ширина.
Другие вопросы о переполнении стека
Я обнаружил два вопроса, которые задают одно и то же:
iOS 14: неверный размер кадра (отрицательный или неконечный)
SwiftUI iOS14 GeometryReader Недопустимый размер кадра
В первом вопросе проблема с потоком имеет смысл, поскольку с учетом кода .frame(width: p.size.width - padding)
нет гарантии, что p.size.width
будет меньше, чем padding
. Насколько я могу судить, это проблема, когда заданное значение может быть отрицательным.
Эта проблема, с которой я столкнулся, связана с тем, что заданное значение не является конечным, поэтому вопросы не связаны между собой.
На второй вопрос до сих пор нет ответа, и он немного расплывчатый, поэтому сейчас он мне не очень полезен. Возможно, позже кто-то ответит полезным ответом, но пока это бесполезно.
Читать
Глядя на документы Apple я нахожу это:
Используйте этот метод, чтобы указать фиксированный размер для ширины, высоты или того и другого представления. Если вы укажете только одно из измерений, результирующее представление примет поведение размеров этого представления в другом измерении.
Тогда почему .frame(width: .infinity, height: 56, alignment: .center)
вообще запускается?
Что Apple имеет в виду, говоря, что «результирующее представление предполагает изменение размеров этого представления в другом измерении»? Будет ли он всегда предполагать, что это представление является «выталкивающим», что дает тот же результат, что и .infinity
?
Я проверил это и запустил этот код:
struct CellStyle: ViewModifier { func body(content: Content) -> some View { content .frame(height: 56, alignment: .center) .padding(.horizontal, 16) } }
Кажется, это дает тот же результат, так что теперь мне любопытно, был ли когда-нибудь случай, когда быстрое "предполагание" ширины приведет к поведению, отличному от .infinity
?
Последний вопрос
В чем разница в поведении между .frame(width: .infinity)
и .frame(width: nil)
(эквивалент выделения либо ширины, либо высоты).
функция кадра (ширина: CGFloat? = nil, высота: CGFloat? = nil, выравнивание: Alignment = .center) -> некоторый вид
Спасибо за помощь!
Если вы прочтете, что я сказал после «Немного чтения», вы увидите, что я это понимаю. Что меня смущает, так это то, почему указание .infinity в качестве ширины или высоты все равно будет работать, а затем, если оставить параметры ширины или высоты, всегда будет выводиться, что ширина/высота будет «выталкивать», например .infinity