如何在SwiftUI中放大滚动视图

如何在SwiftUI中放大滚动视图,swiftui,Swiftui,我正在尝试在SwiftUI中为Catalyst应用程序缩放和平移图像。虽然没有PanGesture,但ScrollView似乎在iPad和Mac上都能正常工作。我就是无法在放大的图像上滚动 struct TestScrollView: View { @State var scale: CGFloat = 1.0 var body: some View { VStack { ScrollView([.horizontal,.vert

我正在尝试在SwiftUI中为Catalyst应用程序缩放和平移图像。虽然没有PanGesture,但ScrollView似乎在iPad和Mac上都能正常工作。我就是无法在放大的图像上滚动

struct TestScrollView: View {
    @State var scale: CGFloat = 1.0
    
    var body: some View {
        VStack {
            ScrollView([.horizontal,.vertical], showsIndicators: false) {
                    Image("image")
                        .resizable()
            }
            .gesture(MagnificationGesture()
            .onChanged({ (scale) in
                self.scale = scale
            }))
                .scaleEffect(self.scale)
        }
    }
}
使用下面的代码

ScrollView([.horizontal,.vertical], showsIndicators: false) {
    Image("large_image")
        .resizable()
        .gesture(MagnificationGesture()
                    .onChanged({ (scale) in
                        self.scale = scale
                    }))
        .scaleEffect(self.scale)
}
…我明白了:


它似乎向右滚动了很多次,但在左侧被切断。

将手势附加到图像上,如

ScrollView([.horizontal,.vertical], showsIndicators: false) {
    Image("large_image")
        .resizable()
        .gesture(MagnificationGesture()
                    .onChanged({ (scale) in
                        self.scale = scale
                    }))
        .scaleEffect(self.scale)
}

应用
scaleEffect
后,内容的帧大小似乎保持不变,这就是您无法在
ScrollView
内滚动的原因。没有地方可以滚动。可以通过手动指定缩放后的帧大小来修复此问题。如果不知道原始帧大小,请使用
GeometryReader
动态缩放后计算帧大小

ScrollView([.horizontal, .vertical], showsIndicators: false) {
    Image(systemName: "square.fill")
        .resizable()
        .frame(width: 200, height: 200)
        .scaleEffect(self.scale)
        .frame(
            width: 200 * self.scale,
            height: 200 * self.scale
        )
}
.gesture(magnificationGesture)

另外,您的
onChanged
实现也存在一些问题。请参阅James提供的。

谢谢,我尝试了您的代码,但它仍然无法按我所希望的方式运行。你能看到我更新的答案并告诉我你是否得到了不同的结果吗?我得到了相同的结果。这个答案有更新吗?