Skip to content

16.1_使用UIPanGestureRecognizer实现视图拖拽

掌握UIPanGestureRecognizer的基础

UIPanGestureRecognizer 是实现视图拖拽的核心工具,它能检测用户手指在屏幕上的移动。通过它,你可以轻松让任何 UIView 动起来,实现直观的用户体验。想象一下,用户可以随意移动屏幕上的卡片或图标,是不是很酷?✨

这个手势识别器会持续跟踪手指的位移,并提供关键信息,比如当前位置和速度。

添加拖拽手势到视图

要让视图可拖拽,你需要创建一个 UIPanGestureRecognizer 实例并将其添加到目标视图上。这通常在视图控制器的 viewDidLoad 方法中完成。

swift
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
yourDraggableView.addGestureRecognizer(panGesture)

这里,yourDraggableView 是你想要拖拽的视图。handlePan 方法将是手势触发时调用的函数。

处理拖拽手势的逻辑

handlePan 方法中,你可以根据手势的状态来更新视图的位置。UIPanGestureRecognizer 有多种状态,最常用的是 .began.changed.ended

  • .began: 当用户首次触摸并开始拖拽时触发。
  • .changed: 当用户手指移动时持续触发,这是你更新视图位置的主要时机。
  • .ended: 当用户抬起手指,拖拽结束时触发。
swift
@objc func handlePan(_ gesture: UIPanGestureRecognizer) {
    let translation = gesture.translation(in: view)
    if let viewToDrag = gesture.view {
        viewToDrag.center = CGPoint(x: viewToDrag.center.x + translation.x,
                                    y: viewToDrag.center.y + translation.y)
        gesture.setTranslation(.zero, in: view) // 重置位移
    }
}

这段代码会获取手势在父视图中的位移量,并将其应用到被拖拽视图的中心点。

理解 translation(in:)setTranslation(_:in:)

translation(in:) 方法返回手势在指定视图坐标系中的累计位移。例如,如果用户将视图向右拖动了 50 点,translation.x 就会是 50。

setTranslation(.zero, in: view) 这一步至关重要。它会将手势的累计位移重置为零。如果不重置,每次 handlePan 被调用时,translation 都会是自手势开始以来的总位移,导致视图“跳跃”式移动。

实践中的小技巧

  • 初始位置记录: 在 .began 状态下,你可以记录视图的初始位置,以便在某些情况下(如拖拽取消)恢复。
  • 速度检测: velocity(in:) 方法可以获取手势的当前速度,这对于实现基于速度的释放动画非常有用。🚀
  • 多点触控: UIPanGestureRecognizer 默认支持单点触控。如果你需要处理多点拖拽,可以调整其 minimumNumberOfTouchesmaximumNumberOfTouches 属性。

通过这些步骤,你就能轻松实现视图的拖拽功能了。是不是感觉自己离动画大师又近了一步?继续加油!💪

本站使用 VitePress 制作