ios - uicollectionview swipe




在iOS中Pan和Swipe有什麼區別? (3)

聽起來很簡單.. 握住觸控板,移動手指,釋放 ..但不知何故滑動沒有被觸發(而是觸發平移)

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模擬器上的輕掃?

根據蘋果文件。 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
    }
  }
}

根據蘋果文件。 Apple 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")
}

識別器的示例圖像


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

在任何方向拖動手指時,平移手勢都會起作用。 你可以給它加速或減速。 例如,將一個物體從一個地方移動到另一個地方或旋轉旋轉器。


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

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

您應該能夠使用委託方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:解決此衝突gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:或者可能沒有委派,通過使泛識別器依賴於帶有requireGestureRecognizerToFail:的滑動識別requireGestureRecognizerToFail:

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





gestures