Apa perbedaan antara Pan dan Gesek di iOS?

129

Kedengarannya sederhana .. Pegang Trackpad, gerakkan jari, lepaskan .. Tapi entah bagaimana menggeseknya tidak dipicu (pan malah dipicu)

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

Geser dikenali oleh urutan di atas sebagai gantinya.

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

Jika pan dikomentari, gesek dikenali oleh gerakan yang sama .. Dengan ini, 2 pertanyaan:

  • Lalu apa perbedaan antara panci dan gesek?
  • Bagaimana seseorang dapat mensimulasikan gesekan pada simulator iPhone?
James Raitsev
sumber
1
@rickster, koreksi saya jika saya salah, tetapi gesek menggunakan empat arah, atas, bawah, kiri, kanan, dan wajan bisa arah mana saja. Benar
Victor Engel

Jawaban:

231

Menurut definisi, gerakan swipe juga harus merupakan gerakan pan - keduanya melibatkan gerakan translasi titik sentuh. Perbedaannya ada pada semantik pengenal: pengenal pan mencari awal gerakan translasi dan terus melaporkan gerakan ke arah mana pun dari waktu ke waktu, sementara pengenal gesek membuat keputusan seketika apakah sentuhan pengguna bergerak secara linear ke arah yang diperlukan.

Secara default, tidak ada dua pengenal yang akan mengenali gerakan yang sama, jadi ada konflik antara panci dan geser. Kemungkinan besar, pengenal pan Anda "memenangkan" konflik karena gerakannya lebih sederhana / lebih umum: Babatan adalah panci tetapi panci mungkin bukan gesekan, jadi panci mengenali terlebih dahulu dan mengecualikan pengenal lainnya.

Anda harus dapat menyelesaikan konflik ini menggunakan metode delegasi gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, atau mungkin tanpa delegasi dengan membuat pengenal pan bergantung pada pengenal gesek dengan requireGestureRecognizerToFail:.

Dengan konflik terselesaikan, Anda harus dapat mensimulasikan gesekan satu jari dengan menyeret mouse dengan cepat. (Meskipun mouse lebih presisi dari jari Anda, itu sedikit lebih rewel daripada melakukan hal yang sebenarnya pada perangkat.) Penggeser dua jari / gesek dapat dilakukan dengan menahan tombol Option & Shift.

rickster
sumber
24
Jawaban bagus. Tapi saya tidak berpikir gerakan gestur menang karena itu lebih umum, tetapi lebih karena itu gerakan kontinu (di mana gesekan adalah gerakan diskrit) sehingga panci dikenali sebelum gesekan. Babatan hanya dikenali pada jari yang diangkat, loyang dikenali segera setelah jari mulai bergerak. Gesek vs. Pan tercakup dengan baik dalam PG Peristiwa di bawah "Mendeklarasikan urutan tertentu untuk dua pengenal isyarat"
raja nevan
27

Gerakan Gesek akan bekerja ketika Anda menyeret jari hanya ke arah tertentu (geser ke atas, geser ke bawah, geser ke kiri, geser ke kanan). Misalnya sel swipeable di pengontrol tampilan tabel.

Pan Gesture akan berfungsi saat Anda menyeret jari ke arah mana pun. Anda dapat memberikan akselerasi atau perlambatan untuk itu. Misalnya, memindahkan objek dari satu tempat ke tempat lain atau memutar pemintal ..

Daya Kevin
sumber
3

Sesuai dokumen apel. Apple UIPanGestureRecognizer Perbedaan antara panci dan gesek seperti di bawah ini: -

UIPanGestureRecognizer adalah subkelas konkret dari UIGestureRecognizer yang mencari gerakan gerakan mendrag (menyeret). Pengguna harus menekan satu atau lebih jari pada tampilan saat mereka menggesernya. Klien yang menerapkan metode tindakan untuk pengenal isyarat ini dapat menanyakannya untuk terjemahan dan kecepatan isyarat saat ini.

Gerakan panning terus menerus. Itu dimulai ( dimulai ) ketika jumlah minimum jari diperbolehkan ( minimumNumberOfTouches ) telah cukup bergerak untuk dianggap sebagai panci. Ini berubah (diubah) ketika jari bergerak sementara setidaknya jumlah minimum jari ditekan ke bawah. Itu berakhir ( berakhir ) ketika semua jari terangkat.

Klien dari kelas ini dapat, dalam metode tindakan mereka, permintaan objek UIPanGestureRecognizer untuk terjemahan gerakan saat ini ( terjemahan (dalam :) ) dan kecepatan terjemahan ( kecepatan (dalam :) ). Mereka dapat menentukan tampilan yang sistem koordinatnya harus digunakan untuk nilai terjemahan dan kecepatan. Klien juga dapat mengatur ulang terjemahan ke nilai yang diinginkan.

Contoh Demo Swift 3 UIPanGestureRecognizer: - Tautan Sumber Daya

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

Sesuai dokumen apel. Apple UITapGestureRecognizer

UITapGestureRecognizer adalah subkelas konkret dari UIGestureRecognizer yang mencari ketukan tunggal atau ganda. Agar gerakan dapat dikenali, jumlah jari yang ditentukan harus mengetuk tampilan beberapa kali.

Meskipun ketukan adalah gerakan diskrit, ketukan terpisah untuk setiap kondisi pengenal isyarat; dengan demikian pesan tindakan yang terkait dikirim ketika gerakan dimulai dan dikirim untuk setiap keadaan perantara hingga (dan termasuk) keadaan akhir gerakan. Karenanya, kode yang menangani gerakan ketuk harus menguji status gerakan itu.

Swift 3 Demo Contoh Sumber Daya UITapGestureRecognizer Demo

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

Contoh Gambar untuk Pengenalmasukkan deskripsi gambar di sini

Rex
sumber
Pertanyaannya adalah tentang perbedaan antara tindakan pan dan swipe dan bagaimana membedakannya di simulator iPhone. Jawaban ini tidak membahas salah satu dari masalah tersebut, karena tidak menyebutkan gerakan gesek atau simulator iPhone.
Vince O'Sullivan
@ VinceO'Sullivan Saya akan mencoba menjelaskan definisi Pan dan Swipe. Saya harap itu akan membuat mengerti untuk membedakan keduanya.
Rex
Posting asli berusia lima tahun dan memiliki jawaban yang diterima (yang juga memiliki sekitar 200 suara). Saya tidak berpikir ada sesuatu yang berguna untuk Anda tambahkan (kecuali ada perbedaan antara cara kerja sekarang dan bagaimana mereka bekerja dalam jawaban yang diterima).
Vince O'Sullivan
@ VinceO'Sullivan Saya menjelaskannya dengan cara mudah dengan contoh sederhana dan definisi dokumen apel. Saya pikir ini lebih fokus pada topik dan gambar menunjukkan pola sentuh di iOS.
Rex
0

Menurut http://hammerjs.github.io/ , saya pikir perbedaannya adalah:

  • pan: memindahkan arah dalam tampilan besar yang sama
  • swipe: beralih di antara beberapa tampilan

Gerakannya sama, keduanya menggunakan satu jari dan bergerak.

JasmineOT
sumber