2012-03-27 21 views
107

聽起來很簡單.. 按住觸控板,移動手指,釋放 ..但不知何故,刷卡沒有被觸發(盤被觸發,而不是)在iOS中Pan和Swipe有什麼區別?

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模擬器上的滑動?
+1

@rickster,糾正我,如果我錯了,但刷卡使用四個方向,上,下,左,右,和平移可以是任何方向。正確 – 2012-12-10 14:47:49

回答

195

根據定義,滑動手勢也必須是平移手勢 - 均涉及觸摸點的平移移動。區別在於識別器語義:平移識別器查找平移運動的開始,並繼續報告隨時間推移的任何方向的運動,而滑動識別器則立即做出用戶觸摸是否在所需方向上線性移動的決定。

默認情況下,沒有兩個識別器會識別相同的手勢,因此泛和滑動之間存在衝突。最有可能的是,你的平底鍋識別器「勝利」了衝突,因爲它的手勢更簡單/更一般:滑動是平底鍋,但平底鍋可能不是輕掃,所以平底鍋首先識別並排除其他識別器。

您應該能夠使用代理方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:解決此衝突,或者也可以不通過使泛識別器依賴於滑動識別器而使用requireGestureRecognizerToFail:來解決此衝突。

解決衝突後,您應該可以通過快速拖動鼠標來模擬單指輕掃。 (雖然鼠標比手指更精確,但要比在設備上做實物更挑剔)。通過按住選項& Shift鍵可以完成雙指平移/滑動。

+4

優秀的解釋。謝謝! – JAM 2012-03-28 00:07:41

+20

很好的答案。但我認爲平移手勢不會贏,因爲它更通用,而是因爲它是連續手勢(滑動是離散手勢),因此平移在滑動之前被識別。只有在擡起的手指上才能識別滑動,在手指開始移動後幾乎立即識別出滑動。在「爲兩個手勢識別器聲明特定順序」下的事件PG中,輕掃與平移的關係很好。 – 2013-10-08 12:06:50

+0

如何用這兩個代表來解決衝突? 你能解釋一下嗎? – Rawan 2015-05-03 13:33:11

23

只有在某些方向上拖動手指(向上滑動,向下滑動,向左滑動,向右滑動),滑動手勢才能起作用。例如表格視圖控制器中的可滑動單元格。

當你在任何方向拖動你的手指時,手勢會起作用。你可以給它加速或減速。例如,移動從一個地方一個對象到另一個地方或紡紡紗..

+6

簡短而甜美。 – 2015-01-13 08:49:46

+1

我喜歡這個解釋;用簡短的英文說明這一點。 – Blaszard 2016-04-22 03:39:04

2

http://hammerjs.github.io/,我覺得不同的是:

  • 鍋:在同一個大查看移動方向
  • 滑動:在多個視圖之間切換

手勢相同,都使用一個手指並移動。

0

根據蘋果文件。Apple UIPanGestureRecognizer盤中,如下面掃動之間的差 : -

UIPanGestureRecognizer是UIGestureRecognizer的具體子類,查找平移(拖動)手勢。用戶在平移視圖時必須按下一個或多個手指。爲這個手勢識別器實現動作方法的客戶可以詢問手勢的當前平移和速度。

平移手勢是連續的。它開始(開始)當允許的手指的最小數量(minimumNumberOfTouches)已移動到足以被視爲一個鍋。當手指移動時,它會改變(改變),同時至少按下最小數量的手指。當所有手指擡起時,它結束(結束)。這個類的

客戶可以在他們的操作方法,查詢UIPanGestureRecognizer對象手勢的當前翻譯(翻譯(中:))和翻譯(速度(在:)速度) 。他們可以指定座標系應該用於平移和速度值的視圖。客戶也可以將翻譯重置爲期望的值。

夫特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

UITapGestureRecognizerUIGestureRecognizer,看起來爲單個或多個抽頭的具體子類。對於要識別的手勢,指定數量的手指必須敲擊指定次數的視圖。

儘管點擊是離散手勢,但它們對於手勢識別器的每個狀態都是離散的;因此相關聯的動作消息在手勢開始時發送並針對每個中間狀態發送,直到(並且包括)手勢的結束狀態。因此,處理輕擊手勢的代碼應該測試手勢的狀態。

斯威夫特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

+0

問題是關於平移和滑動操作之間的區別以及如何在iPhone模擬器上區分它們。這個答案沒有解決任何這些問題,因爲它沒有提到滑動手勢和iPhone模擬器。 – 2017-05-30 08:45:01

+0

@ VinceO'Sullivan我將嘗試解釋Pan和Swipe的定義。我希望能夠理解它們之間的區別。 – Rex 2017-05-30 09:33:20

+0

原帖是五歲,有一個可接受的答案(也有大約200張選票)。我認爲沒有什麼對你有用的補充(除非現在的工作方式與他們在接受的答案中的工作方式有什麼區別)。 – 2017-05-30 10:00:53