Получаю ли я бесконечный цикл при настройке ScrollView с включенным средством чтения геометрии?

#swiftui

#swiftui

Вопрос:

Я пытаюсь разобраться в основах ScrollViews в SwiftUI. Я подумал, что если я создам a Text с рамкой шириной экрана и .infinite height, что, как я понял, означает «такой же большой, как доступное пространство, например, безопасная зона», и поместил его в a ScrollView с другим Text компаньоном, я бы получил размер экрана Text , который можно прокручивать по горизонтали докомпаньон Text .

 struct ContentView: View {
    var body: some View {
        ScrollView(.horizontal, showsIndicators: false) {
            GeometryReader { geometry in
                        VStack {
                            Text("crash me")
                        }
                            .frame(width: geometry.size.width,
                                   height: .infinity,
                                   alignment: .topLeading)
                    }
            Text("crash me")
            
        }
    }
}
  

Если я запускаю это, он просто вылетает. Что в этом такого глупого?

Комментарии:

1. Xcode выдает предупреждение во время выполнения: «Недопустимый размер кадра (отрицательный или не конечный)». Это должно дать вам хорошее представление о том, что вы создаете бесконечный цикл.

2. @George_E да, я так и предполагал. Это .infinite, который приводит к сбою системы.

3. Установка высоты .infinite является проблемой — возможно, вы имели в виду .frame(maxHeight: .infinity) ?

4. @George_E Ах, ты справился. Это было прямо перед моим носом все время…

Ответ №1:

Вместо:

 .frame(height: .infinity)
  

Вы должны использовать:

 .frame(maxHeight: .infinity)
  

Установка точной высоты на .infinity невозможно, но maxHeight означает, что представление увеличит свою высоту до максимально возможного значения. Это может быть размер экрана или любой другой ограничивающий фактор, установленный родителем.