You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现多图片独立拖拽后停留在落点位置的代码修改方案

问题原因

当前代码只记录了拖拽过程中的临时位移,没有为每张贴纸单独存储拖拽结束后的永久位置:拖拽结束时直接清空了选中贴纸状态,临时位移归零,图片自然会回到初始坐标。

修改步骤
  • 给贴纸数据模型新增storedOffset属性(类型为CGSize,默认值.zero),用来持久化记录每张贴纸拖拽后的最终停留位置
  • 调整图片偏移计算逻辑:图片的基础偏移取自身存储的永久偏移,拖拽过程中再叠加实时的临时拖拽偏移
  • 拖拽结束回调里,把本次拖拽产生的临时偏移累加到对应贴纸的永久偏移属性上,再清空临时拖拽状态
完整修改后代码

首先确保Sticker模型包含偏移存储属性:

struct Sticker: Identifiable {
    let id = UUID()
    let name: String
    var storedOffset: CGSize = .zero // 新增属性,记录最终停留的偏移量
}

页面内的拖拽实现代码修改为:

HStack {
    // 用$stickers绑定遍历,支持直接修改数组内的贴纸属性
    ForEach($stickers) { $sticker in
        Image(sticker.name)
            .resizable()
            .frame(width: self.screenWidth*0.2, height: self.screenWidth*0.2)
            .offset(
                x: sticker.storedOffset.width + (self.selectedSticker == sticker ? self.dragOffset.width : 0),
                y: sticker.storedOffset.height + (self.selectedSticker == sticker ? self.dragOffset.height : 0)
            )
            .gesture(
                DragGesture()
                    .updating(self.$dragOffset, body: { (value, state, transaction) in
                        if self.selectedSticker == nil {
                            self.selectedSticker = sticker
                        }
                        state = value.translation
                    })
                    .onEnded { value in
                        // 把本次拖拽的位移累加到永久偏移上
                        sticker.storedOffset.width += value.translation.width
                        sticker.storedOffset.height += value.translation.height
                        // 重置临时状态
                        self.dragOffset = .zero
                        self.selectedSticker = nil
                    }
            )
    }
}
注意事项
  • 如果Sticker是引用类型(class),ForEach可以不用$绑定写法,直接遍历stickers即可修改属性
  • 初始状态下所有贴纸的storedOffset默认是0,不会改动原本的初始布局效果
  • 多张贴纸的偏移是独立存储的,拖拽任意一张都不会影响其他贴纸的位置

内容的提问来源于stack exchange,提问作者Yua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:45:32