iOS 拖拽手势(UIPanGestureRecognizer)只做竖直/水平方向处理

本文详细介绍了如何使用Swift和UIKit中的UIPanGestureRecognizer实现视图的拖拽手势响应。包括手势的添加、回调处理以及如何计算并应用偏移量来更新视图的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拖拽手势提供的函数

函数描述
open func translation(in view: UIView?) -> CGPoint获取到的是移动后手指在相对坐标系内移动的距离
open func setTranslation(_ translation: CGPoint, in view: UIView?)用于设置每次拖拽操作时视图的偏移量,状态切换至end时,要记得清零
open func velocity(in view: UIView?) -> CGPoint获得平移时的速度

解决思路

1.创建拖拽手势实例,并依附于视图

 let v = UIView.init(frame: .init(x: 100, y: 300, width: 100, height: 100))
  v.backgroundColor = .red
        
 let p = UIPanGestureRecognizer.init(target: self, action: #selector(handlePan(pan:)))
  v.addGestureRecognizer(p)

2.实现手势的回调方法

    @objc func handlePan(pan: UIPanGestureRecognizer) {
        if pan.state == .changed || pan.state == .ended {
            let view = pan.view
            var viewRect = view?.frame
            let offset = pan.translation(in: view)
            print(offset.x)
            //例子中只演示仅竖直方向的手势处理,水平方向逻辑与之类似
            viewRect = changeYWith(frame: viewRect!, offset: offset)
            //更新视图的frame,已达到移动的视觉效果
            view?.frame = viewRect!
            //清零视图的偏移量记录
            pan.setTranslation(.zero, in: view)
        }
    }

3.实现更新视图坐标的方法(水平移动只更新x轴坐标,竖直方向移动则只更新y轴坐标)

    func changeYWith(frame: CGRect, offset: CGPoint) -> CGRect {
        var rect = frame
        var viewRect = rect.origin
        viewRect.y = offset.y + viewRect.y
         //移动至屏幕顶端,则不再继续向上
        if viewRect.y <= 0 {
            viewRect.y = 0
        }
        //移动至屏幕底部,则不再向下
        if viewRect.y >= self.view.frame.maxY - rect.height {
            viewRect.y = self.view.frame.maxY - rect.height
        }
        rect.origin = viewRect
        return rect
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值