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


129

听起来很简单.. 握住触控板,移动手指,然后释放 ..但不知何故没有触发滑动(而是触发了平移)

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

潘由上述序列代替。

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

如果对pan进行了注释,则可以用相同的手势来识别滑动。有了这个,有两个问题:

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

1
@rickster,如果我输入错了,请纠正我,但是滑动使用四个方向,上,下,左,右和平移可以是任何方向。正确
Victor Engel 2012年

Answers:


231

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

默认情况下,没有两个识别器会识别相同的手势,因此平移和滑动之间存在冲突。最有可能的是,您的平移识别器“赢得了”冲突,因为它的手势更简单/更笼统:轻扫是平移,但平移可能不是轻扫,因此平移首先识别并排除其他识别器。

您应该能够使用委托方法解决此冲突gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:,或者通过使Pan识别器依赖于带有的滑动识别器,而无需委托requireGestureRecognizerToFail:

解决了冲突后,您应该能够通过快速拖动鼠标来模拟单指轻扫。(尽管鼠标比您的手指更精确,但比在设备上进行真实操作要更灵活一些。)可以通过按住Option和Shift键来进行两指平移/滑动。


24
好答案。但是我不认为平移手势会获胜是因为它更为笼统,而是因为它是连续手势(其中滑动为离散手势),因此在滑动之前就可以识别出平移。仅在抬起的手指上识别出滑动,几乎在手指开始移动后立即识别出锅。在事件PG中的“声明两个手势识别器的特定顺序”下很好地涵盖了“滑动与平移”。

27

当您仅在某些方向上拖动手指时(向上滑动,向下滑动,向左滑动,向右滑动),滑动手势即可使用。例如,表格视图控制器中的可滑动单元格。

当您向任意方向拖动手指时,“平移手势”将起作用。您可以对其进行加速或减速。例如,将对象从一个位置移动到另一个位置或旋转微调器。


3

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

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

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

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

Swift 3 UIPanGestureRecognizer演示示例:- 资源链接

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
    }
  }
}

根据苹果文件。苹果UITapGestureRecognizer

UITapGestureRecognizerUIGestureRecognizer的具体子类用于查找单次或多次点击。为了识别手势,指定数量的手指必须轻击视图多次。

尽管轻击是离散的手势,但是对于手势识别器的每种状态,轻击都是离散的。因此,关联的动作消息在手势开始时发送,并针对每个中间状态发送,直到(包括)手势的结束状态为止。因此,处理轻击手势的代码应测试手势的状态。

Swift 3 UITapGestureRecognizer演示示例 资源链接

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")
}

识别器的示例图像在此处输入图片说明


问题在于平移和滑动操作之间的区别,以及如何在iPhone模拟器上区分它们。这个答案没有解决任何这些问题,因为它既没有提到滑动手势也没有提到iPhone模拟器。
文斯·奥沙利文

@ VinceO'Sullivan我将尝试解释Pan和Swipe的定义。我希望这将使他们能够区分两者。
雷克斯

原始帖子已有5年历史,并且具有可接受的答案(也有大约200票赞成票)。我认为没有什么对您有用的东西(除非现在的工作方式与接受的答案之间有区别)。
文斯·奥沙利文

@ VinceO'Sullivan我用简单的示例和苹果文档定义以简单的方式进行解释。我认为它更侧重于主题和图片,显示了iOS中的触摸模式。
雷克斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.