17

UILongPressGestureRecognizer'ı bir UIPanGestureRecognizer ile birleştirmeyi tercih ediyorum.UILongPressGestureRecognizer'ı UIPanGestureRecognizer ile birleştirme

UIPanGestureRecognizer, uzun bir basışla başlamalıdır. Bunu yapmanın kolay bir yolu var mı? ya da kendi jest tanıyıcımı gerçekten yazmak zorunda mıyım?

Ana ekranda bir şey gibi değildim. Bir simgeye basarsınız ve bir süre sonra simgeler sallanmaya başlar. Daha sonra parmağımı ekrandan serbest bırakmadan parmağımın altındaki simgeyi sürüklemeye başlayabilirim.

cevap

16

ben bir çözüm buldum: Bu UIGestureRecognizerDelegate yöntemi ben aradım tam olarak ne yapar: Aslında

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
20

, sen jest tanıyıcıları birleştirmek zorunda değilsiniz - Eğer yalnızca UILongPressGestureRecognizer ile yapabilirsiniz ... Sen Dokunma (ları) 'asgariPressDuration' için 'allowableMovement' içinde kaldıktan sonra StateBegan'e girin. Parmaklarınızın hiçbirini kaldırdığınız sürece sürekli longPressGesture'de kalırsınız - böylece parmaklarınızı hareket ettirmeye ve hareketi hareket ettirerek StateChanged üzerinden takip edebilirsiniz.

Uzun süreli hareketler süreklidir. Hareket, belirtilen süre boyunca (minimum TressDuration) izin verilen parmakların sayısına (numberPressDuration) basıldığında ve dokunuşların izin verilen hareket aralığının ötesine geçmediğinde (allowableMovement), hareket başlar (UIGestureRecognizerStateBegan). Bir parmak hareket ettiğinde, hareket algılama tanıyıcı Değiştirme durumuna geçiş yapar ve parmaklardan herhangi biri kaldırıldığında (UIGestureRecognizerStateEnded) sona erer.

+3

Gerçi içine çalıştırabilirsiniz Orada bir çok konu: En GestureRecognizer sınıfı başvurusu. UIPanGestureRecognizer ile ilgili en iyi şeylerden biri, tüm pencereyi kaydırmanıza ve değerlerini döndürmenize izin verirken, UILongPressGestureRecognizer'ın alt görünümleri bırakmaması (en azından ClipsToBounds ile olanlar) – Kpmurphy91

+1

Ayrıca, hareket halindeyken "hız" özelliği yoktur Bir LongPress –

15

Bu problem için biraz zor zamanlar geçirdim. Kabul edilen cevap yeterli değildi. Bu yönteme ne koyduğum önemli değil, tava veya kurtarma işleyicileri işe yarayacaktı.

  1. jest Tanıyıcılar delegelerin (benim durumda öz olarak) aynı sınıfa atanır olun ve temsilci sınıf bir UIGestureRecognizerDelegate sağlamak şöyledir: buldum bir çözüm oldu.
  2. (yukarıdaki Yanıt başına gibi) sınıfına aşağıdaki temsilci yöntemi ekleyin:

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
        return YES; 
    } 
    
  3. sınıflarına aşağıdaki temsilci yöntemi ekleyin:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
        if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) { 
          return NO; 
        } 
        return YES; 
    } 
    
  4. Sonra bir özellik ya eklemek veya tavaya başlanmasına izin verilip verilmeyeceğini izleyen ivar (yukarıdaki yönteme bakınız). Benim durumumda BOOL shouldAllowPan.

  5. BOOL'u init veya viewDidLoad ürününüzde NO olarak ayarlayın. LongPress işleyicinizin içinde BOOL'u YES'a ayarlayın.Ben böyle yapmak:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) { 
        shouldAllowPan = NO; 
    } 
    
  6. :

    - (void)panHandler:(UIPanGestureRecognizer *)sender{ 
        if(shouldAllowPan) { 
          // do your stuff 
        } 
    
  7. Ve nihayet panhandler içinde BOOL reset: Ben BOOL bir kontrol yapmak panhandler İçinde

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture { 
    
        if(UIGestureRecognizerStateBegan == gesture.state) { 
         shouldAllowPan = NO; 
        } 
    
        if(UIGestureRecognizerStateChanged == gesture.state) { 
         shouldAllowPan = YES; 
        } 
    } 
    
  8. Ve sonra kendini kutlamak için bir bira al. ;)

+1

+1. Bu adımlar gerçekten op'un hedefini çözmemde bana yardımcı oldu: sadece uzun basıştan sonra sürükle bırakmaya izin vermek. Sadece 2 yorum: 5. adımda 'Began' olup olmadığını kontrol etmek ve ardından YES'e ayarlamak yeterlidir. ' \t halinde (UIGestureRecognizerStateBegan == gesture.state) { \t \t self.shouldAllowDrag = EVET; \t} '' ' Ve 6. adımda' shouldAllowPan' için kontrol etmek gerekli değildir. - biçimlendirilmemiş kod için özür dilerim. –

+1

Andy'nin çözümünü uyguladı ve güzel çalıştı. İstediğim yanıtı elde etmek için, minimum uzun basış süresini de değiştirdim: UILongPressGestureRecognizer * lpgr = [[UILongPressGestureRecognizer ayırma] initWithTarget: self action: @selector (handleLongPressGesture :)]; lpgr.delegate = kendini; lpgr.minimumPressDuration = 0.05; – chmaynard

+1

Bu bana çok yardımcı oldu. Teşekkürler! Başkalarına yardımcı olabilmem için bir Swift çözümü ekleyeceğim. – duyn9uyen

5

Swift Andy B'nin yaklaşımı,

  1. ekle sınıfa

    class ViewController: UIViewController, UIGestureRecognizerDelegate 
    
  2. için üye değişkeni UIGestureRecognizerDelegate delegenin ekle

    var shouldAllowPan: Bool = false 
    
  3. Hareketleri ekleyin ve kaydırma hareketi temsilcisini VC'ye eklemeniz gerekir.

    func longPress(sender: UILongPressGestureRecognizer) { 
    
        if(sender.state == .Began) { 
         // handle the long press 
        } 
        else if(sender.state == .Changed){ 
         shouldAllowPan = true 
    
        } 
        else if (sender.state == .Ended) { 
         shouldAllowPan = false 
        } 
    } 
    
+3

6'yı unuttun.Bir bira kap. :) :) –

+1

@ duyn9uyen Swift'e dönüştürdüğünüz için teşekkür ederiz. –

+0

@ duyn9uyen Dönüşüm için teşekkürler ve bu bir çekicilik gibi çalıştı. – aznelite89

0

"Subclassing Oku: Bu shouldRecognizeSimultaneouslyWithGestureRecognizer ve gestureRecognizerShouldBegin fonksiyonları

// long press 
let longPressRec = UILongPressGestureRecognizer(target: self, action: "longPress:") 
yourView.addGestureRecognizer(longPressRec) 

// drag 
let panRec = UIPanGestureRecognizer(target: self, action: "draggedView:") 
panRec.delegate = self 
yourView.addGestureRecognizer(panRec) 
  • izin eşzamanlı hareketlerini

    uzun basma işleyicisi içinde
    func gestureRecognizer(UIGestureRecognizer, 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool { 
        // println("shouldRecognizeSimultaneouslyWithGestureRecognizer"); 
        return true 
    } 
    
    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
        // We only allow the (drag) gesture to continue if it is within a long press 
        if((gestureRecognizer is UIPanGestureRecognizer) && (shouldAllowPan == false)) { 
         return false; 
        } 
        return true; 
    } 
    
  • ateşlemesi için gereklidir Apple'ın kullanıcı arayüzü "Notlar"

    https://developer.apple.com/library/prerelease/tvos/documentation/UIKit/Reference/UIGestureRecognizer_Class/