【问题标题】:SwiftUI - Drag and drop circlesSwiftUI - 拖放圆圈
【发布时间】:2021-01-24 08:05:51
【问题描述】:

我正在尝试创建可以拖放的圆圈。

我可以让它只使用第一个圆圈,但是,第一个圆圈之后的任何东西都不起作用。

预期行为:圆圈在拖动时跟随我的光标并在拖动结束时落在最终位置

实际行为:圆圈跟随我光标的水平位置,但不是垂直位置(垂直位置总是显着低于我的光标)

ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(alignment: .center) {
            ForEach(0..<5) { _ in
                DraggableCircles()
            }
        }
    }
}

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

struct DraggableCircles: View {
    @State var dragAmount: CGPoint = CGPoint.zero

        var body: some View {
            Circle().fill(Color.red)
            .frame(width: 50, height: 50)
                .gesture(
                    DragGesture(coordinateSpace: .global).onChanged {action in
                        let location = action.location
                        let newWidth = location.x
                        let newHeight = location.y
                        let size = CGPoint(x: newWidth, y: newHeight)
                        self.dragAmount = size
                    }.onEnded{action in
                        let location = action.location
                        let newWidth = location.x
                        let newHeight = location.y
                        let size = CGPoint(x: newWidth, y: newHeight)
                        self.dragAmount = size
                    }
                )
                .position(x: dragAmount.x, y: dragAmount.y)
        }
        
    }


【问题讨论】:

    标签: ios swift user-interface swiftui drag-and-drop


    【解决方案1】:

    您必须将拖动值添加到最后一个位置。正确的计算方法在这里。

    struct DraggableCircles: View {
        
        @State private var location: CGPoint = CGPoint(x: 50, y: 50)
        @GestureState private var startLocation: CGPoint? = nil
        
        var body: some View {
            
            // Here is create DragGesture and handel jump when you again start the dragging/
            let dragGesture = DragGesture()
                .onChanged { value in
                    var newLocation = startLocation ?? location
                    newLocation.x += value.translation.width
                    newLocation.y += value.translation.height
                    self.location = newLocation
                }.updating($startLocation) { (value, startLocation, transaction) in
                    startLocation = startLocation ?? location
                }
            
            return Circle().fill(Color.red)
                .frame(width: 50, height: 50)
                .position(location)
                .gesture(dragGesture)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多