Сделайте так, чтобы содержимое ScrollView заполняло его родитель в SwiftUI - PullRequest
2 голосов
/ 06 июня 2019

Я хотел бы создать экран прокрутки, поэтому я хотел встроить его ScrollView.Но я не могу этого добиться, вид просто сжимается до его сжатого размера.Допустим, я хочу, чтобы ScrollView прокручивал вертикально, поэтому я хотел бы, чтобы содержимое соответствовало ширине scrollView.Поэтому я использую такой предварительный просмотр:

struct ScrollSubview_Previews : PreviewProvider {
    static var previews: some View {
        func textfield() -> some View {
            TextField(.constant("Text")).background(Color.red)
        }

        return Group {
            textfield()
            ScrollView {
                textfield()
            }
        }
    }
}

Но он заканчивается таким результатом:

enter image description here

Ответы [ 4 ]

2 голосов
/ 04 июля 2019

На самом деле вам больше не нужен читатель Geometry.ScrollView был реорганизован в бета-версии XCode 3 Теперь вы можете объявить, что у вас есть .horizontally ScrollView или .vertical. Это заставляет ScrollView вести себя так, как должен, как и любой обычный протокол View.

Пример:

ScrollView(.horizontal, showsIndicators: false) {
    HStack {
        ForEach((1...10).reversed()) {
            AnyViewYouWant(number: $0)
        }
    }
}

Это приведет к виду с шириной родительской прокрутки по горизонтали.Высота будет определяться высотой подпредставлений ScrollView.

0 голосов
/ 07 июня 2019

Вот хитрость: представьте HStack, который имеет только один Spacer:

return Group {
        HStack {
            Spacer()
        }
        textfield()
        ScrollView {
            textfield()
        }
    }
0 голосов
/ 25 июня 2019

Это известная проблема, существующая также в бета-версии 2 - ознакомьтесь с примечаниями к выпуску Apple Xcode 11 здесь.В этом случае я предлагаю использовать GeometryReader для фиксированной ширины экрана, высота автоматически подгоняется под содержимое.

Например, если вам нужно подогнать содержимое ScrollView к ширине экрана, вы можете что-то вроде:

return GeometryReader { geometry in
     Group {
         self.textfield()
         ScrollView {
             self.textfield()
                 .frame(width: geometry.size.width)
         }
     }
 }
0 голосов
/ 06 июня 2019

PreviewProvider - это почти что ваш Canvas (вид рендеринга).

если вы хотите поместить текст в ScrollView, вы должны создать свой View

struct MyViewWithScroll : View {
    var body: some View {
        ScrollView {
            Text("Placeholder")
        }
    }
}

И после этого визуализируйте MyViewWithScroll в Canvas (окно с iPhone с правой стороны редактора кода)

#if DEBUG
struct MyViewWithScroll_Previews : PreviewProvider {
    static var previews: some View {
        MyViewWithScroll()
    }
}
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...