2012-12-19 37 views
2

我有以下代碼:UISwipeGestureRecognizer和UIPanGestureRecognizer在一個視圖中發出

UISwipeGestureRecognizer *swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHighlightReadingVC:)]; 
    swipeGestureRecognizer.delegate = self; 
    [self.highlightReadingVC_.view addGestureRecognizer:swipeGestureRecognizer]; 

    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panHighlightReadingVC:)]; 
    panGestureRecognizer.delegate = self; 
    [panGestureRecognizer requireGestureRecognizerToFail:swipeGestureRecognizer]; 
    [self.highlightReadingVC_.view addGestureRecognizer:panGestureRecognizer]; 

我的問題是,雖然我在視圖上刷卡時,它總是首先檢測平移手勢。我希望在平移/拖動之前首先識別滑動。我怎麼做?

+0

看到我這個答案可能你得到了一些想法swipeGestureRecognizer http://stackoverflow.com/questions/12423253/iphone-uigesturerecognizer-prevents -uitableview-從滾動功能於xcode中-4-5/12423565#12423565 –

回答

2

您將要將兩個UIGestureRecognizer的代表中的一個設置爲有意義的對象(可能是self),然後再聽取並返回YES。當由任一gestureRecognizerotherGestureRecognizer識別手勢的會阻止其識別手勢的其他手勢識別

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

此方法被調用。請注意,返回YES保證允許同時識別;另一方面,返回NO不能保證防止同時識別,因爲其他手勢識別器的代表可能會返回YES

我在我的應用程序&中也遇到同樣的問題,對我來說工作正常。所以它可能會解決你的問題。

0

如果目標是具有手勢/ s的防止識別滑動(通常情況):

swipeGesture.requireGestureRecognizerToFail(panGesture) 

如果目標是具有滑動手勢/ s的防止識別平移(不尋常的情況下):

panGesture.requireGestureRecognizerToFail(swipeGesture) 

另外做平常:

panGesture.delegate = self 
swipeGesture.delegate = self 

並實行shouldRecognizeSimultaneouslyWithGestureRecognizer總是返回true

注:的東西像UIWebView的和UIScrollView的正確解釋單觸摸滑動,這是最好的requireGestureRecognizerToFail所有三(3) :一個平底鍋,一個長按和第二個滑動識別器.numberOfTouchesRequired = 2爲UX直觀地工作。

下面是我們用什麼(SWIFT):

class AboutViewController: UIViewController, UIGestureRecognizerDelegate { 

    @IBOutlet var webView: UIWebView! 

    var swipeToDismiss: UISwipeGestureRecognizer { 
     var r = UISwipeGestureRecognizer(target: self, action: "dismiss:") 
     r.direction = .Right 
     r.delegate = self 
     r.requireGestureRecognizerToFail(longPress) 
     r.requireGestureRecognizerToFail(pan) 
     r.requireGestureRecognizerToFail(doubleSwipe) 
     return r 
    } 

    var doubleSwipe: UISwipeGestureRecognizer { 
     var r = UISwipeGestureRecognizer() 
     r.direction = .Right 
     r.delegate = self 
     r.numberOfTouchesRequired = 2 
     return r 
    } 

    var longPress: UILongPressGestureRecognizer { 
     var r = UILongPressGestureRecognizer() 
     r.allowableMovement = 4000.0 
     r.delegate = self 
     return r 
    } 

    var pan: UIPanGestureRecognizer { 
     var r = UIPanGestureRecognizer() 
     r.delegate = self 
     return r 
    } 

    func dismiss(recognizer: UISwipeGestureRecognizer!) { 
     // ...popViewControllerAnimated(true) 
    } 

    private func setupWebView() { 
     // ... 
     webView.addGestureRecognizer(longPress) 
     webView.addGestureRecognizer(swipeToDismiss) 
     webView.addGestureRecognizer(pan) 
     webView.addGestureRecognizer(doubleSwipe) 
    } 


    // MARK: - UIGestureRecognizerDelegate 

    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
     println("gesture start: \(gestureRecognizer)") 
     return true 
    } 

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     println("multiple gestures: \(gestureRecognizer), \(otherGestureRecognizer)") 
     return true 
    } 


    // MARK: - UIViewController 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupWebView() 
    } 
} 
相關問題