ความแตกต่างระหว่าง Pan และ Swipe ใน iOS คืออะไร?


129

ฟังดูเรียบง่าย .. ถือแทร็กแพดขยับนิ้วปล่อย .. แต่ยังไงก็ตามการปัดก็ไม่ถูกทริกเกอร์ (แพนจะถูกทริกเกอร์แทน)

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

Pan ได้รับการยอมรับจากลำดับข้างต้นแทน

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

หากมีการแสดงความคิดเห็น pan การปัดจะรับรู้ด้วยท่าทางเดียวกัน .. ด้วยคำถาม 2 ข้อนี้:

  • อะไรคือความแตกต่างระหว่างกระทะกับเครื่องรูด?
  • เราจะจำลองการปัดบนเครื่องจำลอง iPhone ได้อย่างไร?

1
@rickster แก้ไขฉันถ้าฉันผิด แต่การปัดใช้สี่ทิศทางขึ้นลงซ้ายขวาและแพนสามารถเป็นทิศทางใดก็ได้ ถูกต้อง
Victor Engel

คำตอบ:


231

ตามความหมายแล้วท่าทางการปัดจำเป็นต้องเป็นท่าทางการแพนด้วยซึ่งทั้งสองอย่างเกี่ยวข้องกับการเคลื่อนที่ของจุดสัมผัส ความแตกต่างอยู่ในความหมายของเครื่องมือจดจำ: ตัวตรวจจับการหมุนจะมองหาจุดเริ่มต้นของการเคลื่อนไหวที่แปลและยังคงรายงานการเคลื่อนไหวในทิศทางใด ๆ เมื่อเวลาผ่านไปในขณะที่ตัวจดจำการปัดจะทำการตัดสินใจทันทีว่าการสัมผัสของผู้ใช้เคลื่อนที่ในแนวตรงไปในทิศทางที่ต้องการหรือไม่

ตามค่าเริ่มต้นจะไม่มีผู้จดจำสองคนที่จดจำท่าทางสัมผัสเดียวกันดังนั้นจึงมีข้อขัดแย้งระหว่างการเลื่อนและการปัด เป็นไปได้มากว่าเครื่องมือจดจำกระทะของคุณ "ชนะ" ความขัดแย้งนี้เนื่องจากท่าทางสัมผัสนั้นง่ายกว่า / ทั่วไปกว่า: การปัดเป็นการเลื่อน แต่การเลื่อนอาจไม่ใช่การปัดดังนั้นตัวกระทะจะรับรู้ก่อนและไม่รวมตัวจดจำอื่น ๆ

คุณควรจะสามารถที่จะแก้ปัญหาความขัดแย้งนี้โดยใช้วิธีการมอบหมายหรือบางทีอาจจะโดยไม่ต้องคณะผู้แทนโดยการจำแนกกระทะขึ้นอยู่กับการจำแนกรูดด้วยgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:requireGestureRecognizerToFail:

เมื่อข้อขัดแย้งได้รับการแก้ไขคุณควรจะจำลองการปัดนิ้วเดียวได้โดยการลากเมาส์อย่างรวดเร็ว (แม้ว่าเมาส์จะแม่นยำกว่านิ้วของคุณ แต่ก็ค่อนข้างพิถีพิถันกว่าการทำของจริงบนอุปกรณ์เล็กน้อย) การเลื่อน / กวาดด้วยสองนิ้วทำได้โดยการกดปุ่ม Option & Shift ค้างไว้


24
คำตอบที่ดี แต่ฉันไม่คิดว่าท่าทางการแพนจะชนะเพราะมันกว้างกว่า แต่เป็นเพราะมันเป็นท่าทางต่อเนื่อง (โดยที่การปัดเป็นท่าทางที่ไม่ต่อเนื่อง) จึงจดจำการแพนได้ก่อนที่จะปัด การปัดจะรับรู้ได้เฉพาะเมื่อนิ้วถูกยกขึ้นกระทะจะรับรู้เกือบจะในทันทีหลังจากที่นิ้วเริ่มขยับ Swipe เทียบกับ Pan ได้รับการคุ้มครองอย่างดีใน Event PG ภายใต้ "การประกาศลำดับที่เฉพาะเจาะจงสำหรับตัวจดจำท่าทางสองตัว"
nevan king

27

Swipe Gesture จะทำงานเมื่อคุณลากนิ้วในบางทิศทางเท่านั้น (ปัดขึ้นปัดลงปัดซ้ายปัดขวา) ตัวอย่างเช่นเซลล์แบบรูดได้ในตัวควบคุมมุมมองตาราง

Pan Gesture จะทำงานเมื่อคุณลากนิ้วไปในทิศทางใดก็ได้ คุณสามารถเร่งความเร็วหรือลดความเร็วได้ ตัวอย่างเช่นการเคลื่อนย้ายสิ่งของจากที่หนึ่งไปอีกที่หนึ่งหรือการหมุนสปินเนอร์ ..


3

ตามเอกสารของ apple Apple UIPanGestureRecognizerความแตกต่างระหว่างการแพนและการปัดดังนี้: -

UIPanGestureRecognizerเป็นคลาสย่อยที่เป็นรูปธรรมของUIGestureRecognizerที่ค้นหาท่าทางการแพน (ลาก) ผู้ใช้จะต้องกดนิ้วอย่างน้อยหนึ่งนิ้วบนมุมมองในขณะที่เลื่อนดู ลูกค้าที่ใช้วิธีการดำเนินการสำหรับเครื่องมือจดจำท่าทางนี้สามารถขอคำแปลปัจจุบันและความเร็วของท่าทางสัมผัสได้

ท่าทางการแพนจะต่อเนื่อง เริ่มต้น ( เริ่ม ) เมื่อจำนวนนิ้วขั้นต่ำที่อนุญาต ( MinimumNumberOfTouches ) ได้ขยับมากพอที่จะถือว่าเป็นกระทะ มันจะเปลี่ยนไป (เปลี่ยน) เมื่อนิ้วขยับในขณะที่กดลงอย่างน้อยที่สุด มันจะสิ้นสุด ( สิ้นสุด ) เมื่อนิ้วทั้งหมดถูกยกขึ้น

ไคลเอนต์ของคลาสนี้สามารถสอบถามอ็อบเจ็กต์ UIPanGestureRecognizer สำหรับการแปลท่าทางปัจจุบัน (การแปล (ใน :) ) และความเร็วของการแปลในวิธีการดำเนินการ ( velocity (in :) ) พวกเขาสามารถระบุมุมมองที่ควรใช้ระบบพิกัดสำหรับค่าการแปลและความเร็ว ลูกค้าอาจรีเซ็ตการแปลเป็นค่าที่ต้องการ

ตัวอย่างการสาธิต UIPanGestureRecognizer Swift 3: - ลิงก์ทรัพยากร

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 Apple UITapGestureRecognizer

UITapGestureRecognizerเป็นคลาสย่อยที่เป็นรูปธรรมของUIGestureRecognizerที่ค้นหาการแตะครั้งเดียวหรือหลายครั้ง เพื่อให้จดจำท่าทางได้จำนวนนิ้วที่ระบุต้องแตะมุมมองตามจำนวนครั้งที่ระบุ

แม้ว่าการแตะจะเป็นท่าทางที่ไม่ต่อเนื่อง แต่ก็ไม่ต่อเนื่องกันสำหรับแต่ละสถานะของเครื่องมือจดจำท่าทาง ดังนั้นข้อความการดำเนินการที่เกี่ยวข้องจะถูกส่งเมื่อท่าทางเริ่มต้นและถูกส่งสำหรับแต่ละสถานะกลางจนกระทั่ง (และรวมถึง) สถานะสิ้นสุดของท่าทางสัมผัส รหัสที่จัดการกับท่าทางสัมผัสควรทดสอบสถานะของท่าทางสัมผัส

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

ภาพตัวอย่างสำหรับ Recognizerป้อนคำอธิบายภาพที่นี่


คำถามเกี่ยวกับความแตกต่างระหว่างการแพนและการปัดนิ้วและวิธีแยกความแตกต่างระหว่างสิ่งเหล่านี้ในเครื่องจำลอง iPhone คำตอบนี้ไม่ได้กล่าวถึงปัญหาใด ๆ เนื่องจากไม่มีการกล่าวถึงท่าทางการปัดหรือเครื่องจำลอง iPhone
Vince O'Sullivan

@ VinceO'Sullivan ฉันจะพยายามอธิบายคำจำกัดความของ Pan and Swipe ฉันหวังว่าจะทำให้เข้าใจเพื่อแยกความแตกต่างระหว่างทั้งคู่
Rex

โพสต์ต้นฉบับมีอายุห้าปีและมีคำตอบที่เป็นที่ยอมรับ (ซึ่งมีผู้โหวตประมาณ 200 คน) ฉันไม่คิดว่าจะมีประโยชน์อะไรสำหรับคุณที่จะเพิ่ม (เว้นแต่จะมีความแตกต่างระหว่างวิธีการทำงานของสิ่งต่างๆในตอนนี้และวิธีการทำงานในคำตอบที่ยอมรับ)
Vince O'Sullivan

@ VinceO'Sullivan ฉันอธิบายด้วยวิธีง่ายๆด้วยตัวอย่างง่ายๆและการกำหนดเอกสารของ Apple ฉันคิดว่ามันมุ่งเน้นไปที่ทั้งหัวข้อและรูปภาพที่แสดงรูปแบบการสัมผัสใน iOS
Rex

0

ตามhttp://hammerjs.github.io/ฉันคิดว่าความแตกต่างคือ:

  • แพน: ย้ายทิศทางในมุมมองขนาดใหญ่เดียวกัน
  • ปัด: สลับไปมาระหว่างมุมมองต่างๆ

ท่าทางจะเหมือนกันทั้งใช้นิ้วเดียวและขยับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.