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

如何在Swift中实现拖拽图片至删除图标完成删除功能?

实现拖拽图片到删除按钮的功能

没问题!我帮你搞定这个拖拽删除的功能~ 只需要在你现有的拖拽手势逻辑里,加上拖拽结束时判断图片是否碰到删除按钮的代码就可以了,看下面的修改:

修改后的完整代码

import UIKit 

class ViewController: UIViewController, UIGestureRecognizerDelegate { 
    var lastScale : CGFloat = 1.0 
    @IBOutlet weak var imgView: UIImageView! 
    @IBOutlet weak var deleteIcon: UIButton! 

    override func viewDidLoad() { 
        super.viewDidLoad() 
        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(recognizer:))) 
        panGestureRecognizer.delegate = self 
        imgView.addGestureRecognizer(panGestureRecognizer) 
        imgView.isUserInteractionEnabled = true 
    } 

    @objc func handlePan(recognizer: UIPanGestureRecognizer) { 
        // 安全获取拖拽的视图,避免强制解包崩溃
        guard let dragView = recognizer.view else { return }
        
        if recognizer.state == .began || recognizer.state == .changed { 
            let translation = recognizer.translation(in: dragView.superview) 
            dragView.center = CGPoint(x: dragView.center.x + translation.x, y: dragView.center.y + translation.y) 
            recognizer.setTranslation(CGPoint.zero, in: dragView.superview) 
        } else if recognizer.state == .ended {
            // 拖拽结束时,检查图片是否与删除按钮重叠
            let imgFrame = dragView.frame
            let deleteBtnFrame = deleteIcon.frame
            
            // 判断两个视图的frame是否有交集
            if imgFrame.intersects(deleteBtnFrame) {
                // 方式1:直接从父视图移除图片(彻底删除)
                dragView.removeFromSuperview()
                // 方式2:隐藏图片(后续可复用)
                // imgView.isHidden = true
            }
        }
    } 

    override func didReceiveMemoryWarning() { 
        super.didReceiveMemoryWarning() 
        // 释放可重建的资源
    } 
}

关键细节说明

  • 安全的可选处理:把原来的强制解包改成guard let,避免手势视图为nil时崩溃,代码更健壮。
  • 拖拽结束的判断时机:选择在手势状态为.ended时处理删除逻辑,因为此时用户已经完成拖拽动作,确认要把图片放到删除区域。
  • 重叠判断逻辑:用frame.intersects(_:)方法快速判断两个视图是否有重叠区域,如果你想要更严格的判断(比如图片大部分进入删除按钮区域才删除),可以计算重叠区域的面积占比,比如:
    let intersectionRect = imgFrame.intersection(deleteBtnFrame)
    let intersectionArea = intersectionRect.width * intersectionRect.height
    let imgArea = imgFrame.width * imgFrame.height
    // 当重叠面积超过图片面积的50%时才删除
    if intersectionArea > imgArea * 0.5 {
        dragView.removeFromSuperview()
    }
    
  • 命名规范修正:把你原来的Lastscale改成了lastScale,符合Swift的小驼峰命名习惯,代码可读性更好。

StoryBoard布局说明

你的StoryBoard布局中,应该包含了一个启用用户交互的UIImageView(即你要拖拽的图片),以及一个用作删除标识的UIButton(比如垃圾桶样式的图标),按钮一般放置在屏幕的固定位置(如底部或右侧边缘),方便用户拖拽图片到该区域完成删除操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:07