簡體   English   中英

UISwipeGestureRecognizer不起作用

[英]UISwipeGestureRecognizer not working

我有一個UIScrollView內部的UIView,兩者都是使用IB創建的。 UIView在UIScrollView中水平滾動。 我想檢測左右2個手指滑動。

借用我在SmpleGestureRecognizers中找到的示例代碼,我將以下代碼放入UIScrollView的ViewController的viewDidLoad方法中...

UIGestureRecognizer *recognizer;
UISwipeGestureRecognizer *swipeRightRecognizer, *swipeLeftRecognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeRightRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeRightRecognizer.numberOfTouchesRequired = 2;
[self.view addGestureRecognizer:swipeRightRecognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeLeftRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeLeftRecognizer.numberOfTouchesRequired = 2;
swipeLeftRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeftRecognizer];
[recognizer release];

我已經在viewcontroller.h中設置了。 並具有以下委托方法...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   return YES;
}

我假設這是一個有效的gestureRecognizer委托方法,但是我在文檔中找不到任何引用。

我沒有出現任何錯誤,但是當我用兩根手指滑動時什么也沒有發生。 沒有調用委托方法,也沒有調用我的動作方法。 我嘗試刪除numbeOfTouchesRequired調用以查看是否可以通過單指輕掃而無濟於事。

我要在正確的視圖中添加gestureRecognizers嗎? 我嘗試將其添加到UIView,UIScrollView以及self.view.superView。

示例代碼運行良好。 我在代碼的實現和示例代碼之間看到的唯一區別是,我使用IB創建視圖,而示例代碼沒有創建視圖。 我懷疑某種東西正在消耗手勢手勢,然后才能傳遞給我的識別器。

我究竟做錯了什么。

謝謝,

約翰

我遇到了同樣的問題,我使用UIPanGestureRecognizer而不是UISwipeGestureRecognizer解決了。

為了模擬滑動檢測,我們將以滾動視圖中的手勢速度進行播放。 例如,如果x方向的速度> = 3000,則將檢測到滑動。

如果x> 0,將是向右滑動。

我為解決您的情況而實現的代碼是:在名為_scroll1的uiscrollview中:

UIPanGestureRecognizer *pan;
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(Swipe4ScrollViews:)];
[pan setMinimumNumberOfTouches:2];
[_scroll1 addGestureRecognizer:pan];
[pan release];

使用名為_panning的全局BOOL變量,Swipe4ScrollViews將完成艱巨的任務:

-(void)Swipe4ScrollViews:(UIPanGestureRecognizer *)sender 
{
    if(sender.state == UIGestureRecognizerStateBegan) _panning = NO;

    CGPoint v =[sender velocityInView:_scroll1];

    NSLog(@"%f, %f",v.x,v.y);

    if( (abs(v.x) >= UMBRAL) && !_panning)
    {
        _panning = YES;
        [sender cancelsTouchesInView];

        if(v.x>0) NSLog(@"Right");
        else NSLog(@"Left");

        [self doSomething];
    }
}

我將其封裝在UIGestureRecognizer子類上: UISwipe4ScrollGestureRecognizer

示例代碼和您的代碼之間的最大區別是您的代碼涉及UIScrollView

在內部,滾動視圖,表格視圖和Web視圖在某種程度上都使用手勢識別器。 如果您希望這些視圖中收到手勢(類似於內部已經支持的手勢),則幾乎可以肯定它們將被消耗或顯着延遲,然后才能使用。 如果用例支持,則在這些視圖之外之上接收手勢應該可以正常工作。

嘗試將UIScrollView的delayContentTouches-property設置為NO,也許會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM