SwiftUI ScrollView с элементом Path не показывает все - PullRequest
0 голосов
/ 01 апреля 2020

это пример кода, чтобы проиллюстрировать мою проблему:

import SwiftUI

struct ContentView: View {
    var body: some View {
        ScrollView {
            VStack {
                subviewone()
                subviewone()
                subviewone()
                subviewone()
                subviewone()
                subviewone()
                graph()
            }.padding(.all)

        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


struct graph: View {
    var body: some View {
        GeometryReader { geo in
            Path { path in
                path.move(to: CGPoint(x: 0, y: 0))
                path.addLine(to: CGPoint(x: geo.size.width, y: 0))
                path.addLine(to: CGPoint(x: geo.size.width, y: geo.size.width))
            }.fill(Color.red)

        }
    }
}

struct subviewone: View {
    var body: some View {
        VStack {
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
        }

    }
}

Мне нужно одно представление, чтобы отобразить некоторый график, и мне нужен размер пространства, выделенного для представления графика, чтобы масштабировать ось. Вот почему я поместил его в GeometryReader.

Когда я запускаю этот код на устройстве, которое необходимо прокрутить (например, iPhone 8), я не могу прокрутить, чтобы увидеть весь «график».

Похоже, что "представление графика" каким-то образом нарисовано вне ScrollView.

Установка фрейма в представлении Path не помогает.

Спасибо за любые помощь предоставлена.

1 Ответ

1 голос
/ 01 апреля 2020

1) вы должны использовать Shape, потому что тогда вы получите прямоугольник, в котором вы можете «рисовать»

2) вы должны дать ему рамку, потому что Apple не знает, насколько велика ваша фигура (см. «Прямоугольники, которые я добавил в конце»)

3) если вы не дадите с ним рамку, вы получите высоту «по умолчанию» для вашей фигуры, а у прямоугольников -

struct ContentView: View {
    var body: some View {
        ScrollView {
            VStack {
                subviewone()
                subviewone()
                subviewone()
                subviewone()
                subviewone()
                subviewone()
                graph()
                    .fill(Color.red)
                    .frame(height:400) // or:  .aspectRatio(contentMode: .fill)
                Rectangle()
                Rectangle()
                Rectangle()


            }.padding(.all)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


struct graph: Shape {
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: CGPoint(x: 0, y: 0))
            path.addLine(to: CGPoint(x: rect.size.width, y: 0))
            path.addLine(to: CGPoint(x: rect.size.width, y: rect.size.width))
        }
    }
}

struct subviewone: View {
    var body: some View {
        VStack {
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
            Text("testtest")
        }

    }
}
...