ios - SwiftUI 无法平移图像

标签 ios swiftui gesture

我无法在 SwiftUI 中找到与平移手势等效的方法。我确实看到
并使用放大、点击、拖动和旋转 - 但我没有看到任何内置的平底锅。在里面
下面的代码片段我添加了一个图像并允许用户缩放 - 但我想要
用户还可以移动缩放的图像以聚焦于感兴趣的区域。拖动,的
当然不能完成这项工作 - 它只是移动框架。

我尝试在顶部分层框架并移动底部图像,但无法做到
工作。

 struct ContentView: View {

    @State var scale: CGFloat = 1.0
    @State var isScaled: Bool = false
    @State private var dragOffset = CGSize.zero

    var body: some View {
        GeometryReader { geo in
            VStack {
                ZStack{
                    RoundedRectangle(cornerRadius: 40)
                        .foregroundColor(Color.white)
                        .frame(width: geo.size.width - 45, height: geo.size.width - 45)
                        .shadow(radius: 10)

                    Image("HuckALaHuckMedium")
                        .resizable()
                        .scaleEffect(self.scale)
                        .frame(width: geo.size.width - 60, height: geo.size.width - 60)
                        .cornerRadius(40)
                        .aspectRatio(contentMode: .fill)
                        .shadow(radius: 10, x: 20, y: 20)

                        //need pan not drag
                        .gesture(
                            DragGesture()
                                .onChanged { self.dragOffset = $0.translation }
                                .onEnded { _ in self.dragOffset = .zero }
                        )
                        //this works but you can't "zoom twice"
                        .gesture(MagnificationGesture()
                            .onChanged { value in
                                self.scale = self.isScaled ? 1.0 : value.magnitude
                        }
                        .onEnded({ value in
                            //self.scale = 1.0
                            self.isScaled.toggle()
                        })
                        )
                        .animation(.easeInOut)
                        .offset(self.dragOffset)
                }//zstack
                Spacer()
            }
        }
    }
}

原始图像示例:

enter image description here

缩放后的图像 - 但拖动而不是平移:

enter image description here

任何指导将不胜感激。 Xcode 11.3 (11C29)

最佳答案

为了使它更简单和更易读,我为此创建了一个扩展/修饰符

struct DraggableView: ViewModifier {
    @State var offset = CGPoint(x: 0, y: 0)
    
    func body(content: Content) -> some View {
        content
            .gesture(DragGesture(minimumDistance: 0)
                .onChanged { value in
                    self.offset.x += value.location.x - value.startLocation.x
                    self.offset.y += value.location.y - value.startLocation.y
            })
            .offset(x: offset.x, y: offset.y)
    }
}

extension View {
    func draggable() -> some View {
        return modifier(DraggableView())
    }
}
现在你要做的就是调用修饰符:
Image(systemName: "plus")
   .draggable()

关于ios - SwiftUI 无法平移图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59707343/

相关文章:

ios - 如何在代码中打开 View Controller

ios - 自定义 UINavigationItem 字体

ios - 使用 Swift 3 将图像上传到解析服务器失败 : "JSON text did not start with array or object"

SwiftUI 如何在滑动 TabView 时访问 ScrollViewReader 的代理

ios - SwiftUI 2 清除列表部分标题的背景

ios - dyld:未加载库:@executable_path/../Frameworks/

SwiftUI - 在协议(protocol)中返回不透明类型

opencv - Opencv中的手势识别

android - setGesture() 显示屏幕外的手势 : Android

android - Android listview打开手势的实现方法