Sự khác biệt giữa Pan và Swipe trong iOS là gì?


129

Nghe có vẻ đơn giản .. Giữ Trackpad, di chuyển ngón tay, nhả .. Nhưng bằng cách nào đó, thao tác vuốt không được kích hoạt (thay vào đó là pan được kích hoạt)

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

Pan được nhận ra bởi trình tự trên thay thế.

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

Nếu pan được nhận xét, vuốt được nhận ra bằng cùng một cử chỉ .. Với điều này, 2 câu hỏi:

  • Sự khác biệt giữa chảo và vuốt là gì?
  • Làm thế nào một người có thể mô phỏng một thao tác vuốt trên trình giả lập iPhone?

1
@rickster, sửa tôi nếu tôi sai, nhưng vuốt sử dụng bốn hướng, lên, xuống, trái, phải và pan có thể là bất kỳ hướng nào. Đúng
Victor Engel

Câu trả lời:


231

Theo định nghĩa, cử chỉ vuốt cũng nhất thiết phải là cử chỉ xoay - cả hai đều liên quan đến chuyển động tịnh tiến của các điểm chạm. Sự khác biệt nằm ở ngữ nghĩa của trình nhận dạng: trình nhận dạng pan tìm kiếm sự bắt đầu của chuyển động tịnh tiến và tiếp tục báo cáo chuyển động theo bất kỳ hướng nào theo thời gian, trong khi trình nhận dạng vuốt đưa ra quyết định tức thời về việc người dùng có chạm vào tuyến tính theo hướng yêu cầu hay không.

Theo mặc định, không có hai người nhận dạng sẽ nhận ra cùng một cử chỉ, do đó, có một xung đột giữa xoay và vuốt. Nhiều khả năng, trình nhận dạng pan của bạn "thắng" xung đột vì cử chỉ của nó đơn giản / tổng quát hơn: Một lần vuốt là một chảo nhưng một chảo có thể không phải là một cú vuốt, do đó, pan nhận ra trước và loại trừ các nhận dạng khác.

Bạn sẽ có thể giải quyết xung đột này bằng phương thức ủy nhiệm gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:hoặc có thể không có ủy quyền bằng cách làm cho trình nhận dạng pan phụ thuộc vào trình nhận dạng vuốt với requireGestureRecognizerToFail:.

Với xung đột đã được giải quyết, bạn sẽ có thể mô phỏng thao tác vuốt bằng một ngón tay bằng cách kéo chuột nhanh chóng. (Mặc dù chuột chính xác hơn ngón tay của bạn, nhưng nó tinh tế hơn một chút so với thực tế trên thiết bị.) Có thể thực hiện thao tác xoay / vuốt hai ngón tay bằng cách giữ các phím Tùy chọn & Shift.


24
Câu trả lời tốt đẹp. Nhưng tôi không nghĩ rằng cử chỉ pan thắng vì nó chung chung hơn, nhưng vì đó là một cử chỉ liên tục (trong đó một lần vuốt là một cử chỉ rời rạc) nên một chảo được nhận ra trước khi vuốt. Vuốt chỉ được nhận ra trên ngón tay đang được nâng lên, chảo được nhận ra gần như ngay lập tức sau khi ngón tay bắt đầu di chuyển. Swipe vs. Pan được bảo vệ tốt trong Sự kiện PG trong phần "Khai báo một thứ tự cụ thể cho hai nhận dạng cử chỉ".
vua nevan

27

Swipe Gesture sẽ hoạt động khi bạn chỉ kéo ngón tay theo một số hướng nhất định (vuốt lên, vuốt xuống, vuốt sang trái, vuốt sang phải). Ví dụ các ô có thể vuốt trong bộ điều khiển xem bảng.

Pan Gesture sẽ hoạt động khi bạn kéo ngón tay theo bất kỳ hướng nào. Bạn có thể tăng tốc hoặc giảm tốc cho nó. Ví dụ, di chuyển một đối tượng từ nơi này sang nơi khác hoặc quay một vòng quay ..


3

Theo tài liệu táo. Apple UIPanGestureRecognizer Sự khác biệt giữa pan và vuốt như dưới đây: -

UIPanGestureRecognizer là một lớp con cụ thể của UIGestureRecognizer tìm kiếm các cử chỉ lia máy (kéo). Người dùng phải nhấn một hoặc nhiều ngón tay trên một khung nhìn trong khi họ xoay nó. Khách hàng thực hiện phương pháp hành động cho trình nhận dạng cử chỉ này có thể yêu cầu nó cho bản dịch hiện tại và vận tốc của cử chỉ.

Một cử chỉ lia máy liên tục. Nó bắt đầu ( bắt đầu ) khi số lượng ngón tay tối thiểu được phép ( tối thiểuNumberOfTouches ) đã di chuyển đủ để được coi là một cái chảo. Nó thay đổi (thay đổi) khi một ngón tay di chuyển trong khi ít nhất số ngón tay tối thiểu được nhấn xuống. Nó kết thúc ( kết thúc ) khi tất cả các ngón tay được nâng lên.

Các khách hàng của lớp này có thể, trong các phương thức hành động của họ, truy vấn đối tượng UIPanGestureRecognizer cho bản dịch hiện tại của cử chỉ ( bản dịch (in :) ) và vận tốc của bản dịch ( vận tốc (trong :) ). Họ có thể chỉ định chế độ xem có hệ thống tọa độ nên được sử dụng cho các giá trị dịch và vận tốc. Khách hàng cũng có thể đặt lại bản dịch thành giá trị mong muốn.

Ví dụ về Demo 3 UIPanGestureRecognizer: - Liên kết tài nguyên

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

Theo tài liệu táo. Apple UITapGestureRecognizer

UITapGestureRecognizer là một lớp con cụ thể của UIGestureRecognizer tìm kiếm một hoặc nhiều vòi. Để cử chỉ được nhận dạng, số ngón tay được chỉ định phải nhấn vào chế độ xem một số lần được chỉ định.

Mặc dù vòi là những cử chỉ riêng biệt, nhưng chúng là riêng biệt cho từng trạng thái của bộ nhận dạng cử chỉ; do đó, thông điệp hành động liên quan được gửi khi cử chỉ bắt đầu và được gửi cho từng trạng thái trung gian cho đến khi (và bao gồm) trạng thái kết thúc của cử chỉ. Do đó, mã xử lý cử chỉ nhấn nên kiểm tra trạng thái của cử chỉ.

Swift 3 UITapGestureRecognizer Demo Ví dụ Liên kết tài nguyên

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

Hình ảnh ví dụ cho Trình nhận dạngnhập mô tả hình ảnh ở đây


Câu hỏi là về sự khác biệt giữa các hành động xoay và vuốt và cách phân biệt giữa chúng trên trình giả lập iPhone. Câu trả lời này không giải quyết bất kỳ vấn đề nào, vì nó đề cập đến cả cử chỉ vuốt cũng như trình giả lập iPhone.
Vince O'Sullivan

@ VinceO'Sullivan Tôi sẽ cố gắng giải thích định nghĩa của Pan và Swipe. Tôi hy vọng điều đó sẽ giúp hiểu được sự khác biệt giữa cả hai.
Rex

Bài viết gốc năm tuổi và có câu trả lời được chấp nhận (cũng có khoảng 200 phiếu bầu). Tôi không nghĩ có gì hữu ích để bạn thêm vào (trừ khi có sự khác biệt giữa cách mọi thứ hoạt động bây giờ và cách chúng hoạt động trong câu trả lời được chấp nhận).
Vince O'Sullivan

@ VinceO'Sullivan Tôi giải thích nó một cách dễ dàng với ví dụ đơn giản và định nghĩa tài liệu táo. Tôi nghĩ rằng nó tập trung nhiều hơn vào cả chủ đề và hình ảnh cho thấy kiểu cảm ứng trong iOS.
Rex

0

Theo http://hammerjs.github.io/ , tôi nghĩ sự khác biệt là:

  • pan: di chuyển hướng trong cùng một góc nhìn lớn
  • vuốt: chuyển giữa nhiều chế độ xem

Cử chỉ giống nhau, cả hai sử dụng một ngón tay và di chuyển.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.