İOS'ta Kaydırma ve Kaydırma arasındaki fark nedir?


129

Kulağa basit geliyor .. İzleme Panelini tutun, parmağınızı hareket ettirin, bırakın .. Ancak bir şekilde kaydırma işlemi tetiklenmiyor (bunun yerine kaydırma tetikleniyor)

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

Pan, bunun yerine yukarıdaki sıra ile tanınır.

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

Kaydırma yorumlanırsa, kaydırma aynı hareketle tanınır. Bununla birlikte, 2 soru:

  • O halde pan ve tokatlamak arasındaki fark nedir?
  • İPhone simülatöründe bir kaydırmayı nasıl simüle edebilirim?

1
@rickster, yanılıyorsam düzelt ama kaydırma dört yön kullanır; yukarı, aşağı, sola, sağa ve kaydırma herhangi bir yön olabilir. Doğru
Victor Engel

Yanıtlar:


231

Tanım gereği, kaydırma hareketi aynı zamanda bir kaydırma hareketidir - her ikisi de temas noktalarının dönüşümsel hareketini içerir. Fark, tanıyıcı semantiğidir: bir pan tanıyıcı, çeviri hareketinin başlangıcını arar ve zaman içinde herhangi bir yöndeki hareketi rapor etmeye devam ederken, bir kaydırma tanıyıcı, kullanıcının dokunuşlarının doğrusal olarak istenen yönde hareket edip etmediğine dair anlık bir karar verir.

Varsayılan olarak, iki tanıyan aynı hareketi tanımaz, bu nedenle kaydırma ve kaydırma arasında bir çelişki vardır. Büyük olasılıkla, pan tanıyıcınız çatışmayı "kazanır" çünkü hareketi daha basit / daha geneldir: Kaydırmak bir kaydırmadır, ancak bir kaydırma değildir, bu nedenle pan önce tanır ve diğer tanıyıcıları hariç tutar.

Bu çatışmayı temsilci yöntemini kullanarak gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:veya belki de delege olmadan, pan tanıyıcıyı kaydırma tanıyıcıya bağlı hale getirerek çözebilmelisiniz requireGestureRecognizerToFail:.

Çatışma çözüldüğünde, fareyi hızlıca sürükleyerek tek parmakla kaydırmayı simüle edebilmelisiniz. (Fare parmağınızdan daha hassas olmasına rağmen, bir cihazda gerçek şeyi yapmaktan biraz daha titizdir.) Option & Shift tuşlarını basılı tutarak iki parmakla kaydırma / kaydırma yapılabilir.


24
Güzel cevap. Ancak, pan hareketinin daha genel olduğu için kazandığını sanmıyorum, bunun yerine sürekli bir hareket olduğu için (burada kaydırmanın ayrı bir hareket olduğu), bu yüzden kaydırmadan önce pan tanınır. Kaydırma, yalnızca kaldırılan parmakla tanınır, tava, parmak hareket etmeye başladıktan hemen sonra tanınır. Kaydırmaya Karşı Kaydırma, Etkinlik PG'sinde "İki hareket tanıyıcı için belirli bir sıra bildirme" başlığı altında ele alınmıştır.
nevan king

27

Kaydırma Hareketi, parmağınızı yalnızca belirli yönlerde sürüklediğinizde çalışır (yukarı kaydırın, aşağı kaydırın, sola kaydırın, sağa kaydırın). Örneğin, tablo görünümü denetleyicisindeki kaydırılabilir hücreler.

Pan Gesture, parmağınızı herhangi bir yönde sürüklediğinizde çalışacaktır. Ona hızlanma veya yavaşlama verebilirsiniz. Örneğin, bir nesneyi bir yerden başka bir yere taşımak veya bir eğirmeyi döndürmek ..


3

Apple belgesine göre. Apple UIPanGestureRecognizer Bir pan ve tokatlamak arasındaki fark aşağıdaki gibidir: -

UIPanGestureRecognizer somut bir alt sınıf olan UIGestureRecognizer görünüyor kaydırma için (sürükleme) o hareketler. Kullanıcı, bir görüntüyü kaydırırken bir veya daha fazla parmağına basmalıdır. Bu hareket tanıyıcı için eylem yöntemini uygulayan müşteriler, ondan hareketin geçerli çevirisini ve hızını isteyebilir.

Kaydırma hareketi süreklidir. O (başlar başladı izin parmakların en az sayıda (zaman) minimumNumberOfTouches pan dikkate alınması gereken) yeterli taşındı. En azından minimum sayıda parmak basılıyken bir parmak hareket ettiğinde değişir (değişir). Tüm parmaklar kaldırıldığında sona erer (biter ).

Bu sınıfın istemcileri, eylem yöntemlerinde, hareketin geçerli çevirisi ( çeviri (in :) ) ve çevirinin hızı (hız (in :) ) için UIPanGestureRecognizer nesnesini sorgulayabilir . Koordinat sisteminin öteleme ve hız değerleri için kullanılması gereken görünümü belirleyebilirler. Müşteriler ayrıca çeviriyi istenen bir değere sıfırlayabilir.

Swift 3 UIPanGestureRecognizer Demo Örneği: - Kaynak Bağlantısı

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 belgesine göre. Apple UITapGestureRecognizer

UITapGestureRecognizer somut bir alt sınıf olan UIGestureRecognizer bu tek veya çoklu dokunma için görünüyor. Hareketin tanınması için, belirtilen sayıda parmak görünüme belirli sayıda dokunmalıdır.

Dokunmalar ayrı hareketler olsa da, hareket tanıyıcının her durumu için ayrıdırlar; bu nedenle ilişkili eylem mesajı, hareket başladığında gönderilir ve hareketin bitiş durumuna kadar (ve dahil) her ara durum için gönderilir. Dokunma hareketlerini işleyen kod, bu nedenle hareketin durumunu test etmelidir.

Swift 3 UITapGestureRecognizer Demo Örneği Kaynak Bağlantısı

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

Tanıyıcı için Örnek Görüntügörüntü açıklamasını buraya girin


Soru, kaydırma ve kaydırma eylemleri arasındaki fark ve bir iPhone simülatöründe bunların nasıl ayırt edileceğiyle ilgilidir. Bu cevap, ne kaydırma hareketlerinden ne de iPhone simülatörlerinden bahsetmediği için bu sorunların hiçbirini ele almıyor.
Vince O'Sullivan

@ VinceO'Sullivan Pan ve Swipe'ın tanımını açıklamaya çalışacağım. Umarım bu ikisi arasında ayrım yapmayı anlamaya yardımcı olur.
Rex

Orijinal gönderi beş yaşında ve kabul edilmiş bir cevaba sahip (ayrıca yaklaşık 200 ek oy var). Eklemeniz gereken yararlı bir şey olduğunu sanmıyorum (işlerin şu anda nasıl çalıştığı ile kabul edilen cevapta nasıl çalıştıkları arasında farklılıklar olmadığı sürece).
Vince O'Sullivan

@ VinceO'Sullivan Basit bir örnekle ve elma belge tanımıyla bunu kolay bir şekilde anlatıyorum. Sanırım hem konuya daha çok odaklanıyor hem de resim iOS'taki dokunma modelini gösteriyor.
Rex

0

Http://hammerjs.github.io/ 'ya göre , farkın şudur:

  • pan: yönleri aynı büyük görünümde taşıma
  • kaydırma: birkaç görünüm arasında geçiş yapma

Hareket aynı, hem tek parmağınızı kullanın hem de hareket edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.