在iOS中Pan和Swipe有什么区别?

时间:2012-03-27 22:27:53

标签: ios gesture-recognition gestures

听起来很简单.. 抓住触控板,移动手指,释放 ..但不知何故滑动未被触发(平移被触发)

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] 
      initWithTarget:v action:@selector(handleSwipe:)];
swipeGesture.direction= UISwipeGestureRecognizerDirectionUp;
[v addGestureRecognizer:swipeGesture];

Pan被上述序列识别。

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] 
      initWithTarget:v action:@selector(handlePan:)];
[v addGestureRecognizer: panGesture];

如果评论了平移,则通过相同的手势识别滑动。有了这个,2个问题:

  • 平移和滑动有什么区别?
  • 如何在iPhone模拟器上模拟滑动?

4 个答案:

答案 0 :(得分:221)

根据定义,滑动手势也必然是平移手势 - 两者都涉及触摸点的平移运动。区别在于识别器语义:平移识别器寻找平移运动的开始并继续报告随时间在任何方向上的移动,而滑动识别器立即决定用户的触摸是否在所需方向上线性移动。

默认情况下,没有两个识别器会识别相同的手势,因此平移和滑动之间存在冲突。最有可能的是,你的pan识别器会“赢得”冲突,因为它的手势更简单/更通用:滑动是一个平移但是平底锅可能不是一个滑动,所以平移首先识别并排除其他识别器。

您应该能够使用委托方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:来解决此冲突,或者可以通过使平移识别器依赖于requireGestureRecognizerToFail:的滑动识别器来解决此冲突。

解决冲突后,您应该可以通过快速拖动鼠标来模拟单指滑动。 (虽然鼠标比你的手指更精确,但它比在设备上做真实的东西更加挑剔。)双手平移/滑动可以通过按住Option& Shift键。

答案 1 :(得分:27)

只在某些方向拖动手指时,滑动手势才会起作用(向上滑动,向下滑动,向左滑动,向右滑动)。例如,表视图控制器中的可滑动单元格。

当您向任何方向拖动手指时,Pan Gesture都会工作。您可以给它加速或减速。举个例子,将一个物体从一个地方移动到另一个地方或者旋转一个旋转器......

答案 2 :(得分:0)

根据http://hammerjs.github.io/,我认为区别在于:

  • pan:在同一个大视图中移动方向
  • 滑动:在多个视图之间切换

手势是一样的,都用一根手指移动。

答案 3 :(得分:0)

  

根据苹果文件。 Apple UIPanGestureRecognizer   平移和滑动之间的差异如下: -

UIPanGestureRecognizer UIGestureRecognizer 的具体子类,用于查找平移(拖动)手势。用户必须在视图上按下一个或多个手指。实现此手势识别器的操作方法的客户端可以询问其当前的手势转换和速度。

平移手势是连续的。当允许的最小手指数( minimumNumberOfTouches )移动到足以被视为平移时,它开始(开始)。当手指移动时,它会改变(改变),同时至少按下最小数量的手指。当所有手指都被抬起时,它结束(结束)。

此类的客户端可以在其操作方法中查询UIPanGestureRecognizer对象以获取当前手势转换(转换(in :)))和转换速度( velocity (在:))。他们可以指定其坐标系应用于平移和速度值的视图。客户还可以将翻译重置为所需的值。

Swift 3 UIPanGestureRecognizer演示示例: - Resource Link

import UIKit

class ViewController: UIViewController {
// this records our circle's center for use as an offset while dragging
var circleCenter: CGPoint!

override func viewDidLoad() {
    super.viewDidLoad()

    // Add a draggable view
    let circle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
    circle.center = self.view.center
    circle.layer.cornerRadius = 50.0
    circle.backgroundColor = UIColor.green()

    // add pan gesture recognizer to
    circle.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.dragCircle)))

    self.view.addSubview(circle)
}

func dragCircle(gesture: UIPanGestureRecognizer) {
    let target = gesture.view!

    switch gesture.state {
    case .began, .ended:
        circleCenter = target.center
    case .changed:
        let translation = gesture.translation(in: self.view)
        target.center = CGPoint(x: circleCenter!.x + translation.x, y: circleCenter!.y + translation.y)
    default: break
    }
  }
}

根据苹果文件。 Apple UITapGestureRecognizer

UITapGestureRecognizer UIGestureRecognizer 的具体子类,用于查找单个或多个点击。对于要识别的手势,指定数量的手指必须按指定的次数点击视图。

虽然点击是离散手势,但它们对于手势识别器的每个状态都是离散的;因此,当手势开始时发送相关联的动作消息,并且针对每个中间状态发送相关动作消息,直到(并且包括)手势的结束状态。因此,处理轻击手势的代码应该测试手势的状态。

Swift 3 UITapGestureRecognizer演示示例 Resource Link

override func viewDidLoad() {
   super.viewDidLoad()

   let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped))
   tap.numberOfTapsRequired = 2
   view.addGestureRecognizer(tap)
}
func doubleTapped() {
     // do something cool here
     print("Test TapGesture")
}

识别器的示例图像 enter image description here