SwiftUI: сделайте ScrollView прокручиваемым, только если он превышает высоту экрана - PullRequest
1 голос
/ 19 июня 2020

В настоящее время у меня есть представление, которое выглядит следующим образом.

struct StatsView: View {
    var body: some View {
        ScrollView {
            Text("Test1")
            Text("Test2")
            Text("Test3")
        }
    }
}

Это отображает представление, содержащее 3 текста внутри представления прокрутки, всякий раз, когда я перетаскиваю любой из этих текстов на экран, представление будет перемещаться, потому что его можно прокручивать, даже если эти 3 текста умещаются на экране и остается свободное место. Я хочу сделать ScrollView прокручиваемым только в том случае, если его содержимое превышает размер экрана, в противном случае я хочу, чтобы представление было stati c и не перемещалось. Я попытался использовать GeometryReader и установить для рамки просмотра прокрутки ширину и высоту экрана, то же самое для содержимого, но я продолжаю вести себя так же, также я попытался безуспешно установить minHeight, maxHeight.

Как мне этого добиться?

1 Ответ

3 голосов
/ 19 июня 2020

Вот решение (протестировано с Xcode 11.4 / iOS 13.4)

struct StatsView: View {
    @State private var fitInScreen = false
    var body: some View {
        GeometryReader { gp in
            ScrollView {
                VStack {          // container to calculate total height
                    Text("Test1")
                    Text("Test2")
                    Text("Test3")
                    //ForEach(0..<50) { _ in Text("Test") } // uncomment for test
                }
                .background(GeometryReader {
                    // calculate height by consumed background and store in 
                    // view preference
                    Color.clear.preference(key: ViewHeightKey.self,
                        value: $0.frame(in: .local).size.height) })
            }
            .onPreferenceChange(ViewHeightKey.self) {
                 self.fitInScreen = $0 < gp.size.height    // << here !!
            }
            .disabled(self.fitInScreen)
        }
    }
}

Примечание: ViewHeightKey ключ предпочтения взят из это мое решение

...