在iOS平移和滑动有什么区别?

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

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]; 

如果平移被评论,滑动被同一个手势识别。有了这个,2个问题:

  • 泛和刷卡有什么区别?
  • 如何模拟一个iPhone模拟器上的滑动?

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

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

您应该能够使用委托方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:解决此冲突gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:或者也许没有委派,通过使用滑动识别器与requireGestureRecognizerToFail:依靠滑动识别requireGestureRecognizerToFail:

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

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

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

根据http://hammerjs.github.io/ ,我认为不同的是:

  • 平移:在相同的大视图中移动方向
  • 刷卡:在几个视图之间切换

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

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

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

平移手势是连续的。 它开始( 开始 ),当允许的最小数量的手指( minimumNumberOfTouches )已经足够移动被认为是一个锅。 当手指移动时,它会改变(改变),而至less最less的手指被按下。 当所有手指抬起时,它结束( 结束 )。

此类的客户端可以在其操作方法中查询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的一个具体子类,用于查找单个或多个水龙头。 对于要识别的手势,指定数量的手指必须敲击指定次数的视图。

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

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

识别器的示例图像 在这里输入图像描述