我正在尝试在 Catalyst 应用程序的 SwiftUI 中缩放和平移图像。\xc2\xa0没有 PanGesture,但 ScrollView 似乎在 iPad 和 Mac 上都能正常工作。\xc2\xa0 我只是无法滚动放大图像周围。\xc2\xa0\xc2\xa0
\nstruct TestScrollView: View {\n @State var scale: CGFloat = 1.0\n \n var body: some View {\n VStack {\n ScrollView([.horizontal,.vertical], showsIndicators: false) {\n Image("image")\n .resizable()\n }\n .gesture(MagnificationGesture()\n .onChanged({ (scale) in\n self.scale = scale\n }))\n .scaleEffect(self.scale)\n }\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n并使用以下代码...
\nScrollView([.horizontal,.vertical], showsIndicators: false) {\n Image("large_image")\n .resizable()\n .gesture(MagnificationGesture()\n .onChanged({ (scale) in\n self.scale = scale\n }))\n .scaleEffect(self.scale)\n}\n
Run Code Online (Sandbox Code Playgroud)\n...我明白了:
\n\n它似乎向右滚动了很多,并且在左侧被切断。
\n应用后内容的框架大小似乎保持不变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)
Run Code Online (Sandbox Code Playgroud)
另外,您MagnificationGesture
的onChanged
实现存在一些问题。参考James的这个回答。