Рамка и смещение содержимого SwiftUI ScrollView - PullRequest
1 голос
/ 06 марта 2020

Может ли кто-нибудь объяснить поведение этого тестового кода ScrollView - почему я не могу прокрутить до левого и верхнего краев и почему я могу прокручивать дальше правого и нижнего краев? И как это исправить. (Обратите внимание, что если мы удалим VStack, поведение не изменится.)

    var body: some View {

        ScrollView.init([.vertical,.horizontal]) {

            VStack {
                Text("AAA")
                    .padding(8)
                    .frame(width: 1024, height: 1024)
                    .background(Color.orange)
                    .border(Color.red)
            }

        }
        .border(Color.blue)

    }

На этом изображении как можно дальше влево и вверх, как я могу прокрутить - он не прокручивается до краев : enter image description here

Но здесь я могу прокрутить за нижний и правый края: enter image description here enter image description here

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Или вы можете попробовать использовать один ScrollView для каждого направления, попробуйте это

import SwiftUI

struct ContentView: View {
    var body: some View {

        ScrollView(.horizontal, showsIndicators: true) {
            ScrollView(.vertical, showsIndicators: true) {
                Color.yellow.frame(width: 1024, height: 1024)
                    .overlay(Text("A").font(.largeTitle), alignment: .topLeading)
                    .overlay(Text("B").font(.largeTitle), alignment: .topTrailing)
                    .overlay(Text("C").font(.largeTitle), alignment: .bottomTrailing)
                    .overlay(Text("D").font(.largeTitle), alignment: .bottomLeading)
            }
        }

    }
}

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

ОБНОВЛЕНИЕ

, чтобы увидеть, что происходит с помощью модификатора .offset, попробуйте представить результат этого фрагмента

import SwiftUI

struct ContentView: View {
    var body: some View {

        HStack {
            Text("Hello").padding().background(Color.yellow).offset(x: 20, y: 40).border(Color.red)
            Text("World").padding().background(Color.pink).offset(x: -10, y: -10).border(Color.yellow)
            }.padding().border(Color.gray)

    }
}

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

enter image description here

1 голос
/ 07 марта 2020

Я адаптировал ответ @ Asperi к другому вопросу ( SwiftUI Как выровнять вид, который больше ширины экрана ), и это работает.

    @State private var offset : CGPoint = .zero

    var body: some View {

        ScrollView.init([.vertical,.horizontal]) {

            VStack {
                Text("AAA")
                    .padding(8)
                    .frame(width: 1024, height: 1024)
                    .background(Color.orange)
                    .border(Color.red)
            }
            .background(rectReader())
            .offset(x: self.offset.x, y: self.offset.y)

        }
        .border(Color.blue)

    }

    func rectReader() -> some View {
        return GeometryReader { (geometry) -> AnyView in
            let offset : CGPoint = CGPoint.init(
                x: -geometry.frame(in: .global).minX,
                y: -geometry.frame(in: .global).minY
            )
            if self.offset == .zero {
                DispatchQueue.main.async {
                    self.offset = offset
                }
            }
            return AnyView(Rectangle().fill(Color.clear))
        }
    }
...