2012-07-01 24 views
0

在我的主視圖控制器中,我有一個uislider。 ,同時我將UISwipeGestureRecognizer分配給self.view ,因爲我想檢測整個視圖上的手勢。UISlider + UISwipeGestureRecognizer不工作第一次

問題是,無論何時我滑動滑塊,手勢識別器 都會捕獲它,並且滑塊行爲不穩定並且不太好。

這裏是我的代碼(姿態的一部分)

UISwipeGestureRecognizer* singleSwipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeRight:)]; 
    [singleSwipeRight setDirection:(UISwipeGestureRecognizerDirectionRight)]; 
    singleSwipeRight.numberOfTouchesRequired = 1; 
    singleSwipeRight.delegate = self; 
    [self.view addGestureRecognizer: singleSwipeRight]; 

正如我在HERE讀,防止這種情況,只需要實現以下委託:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 


    if ([touch.view isKindOfClass:[UISlider class]]) { 
     // prevent recognizing touches on the slider 
     //NSLog(@"no"); 
     return NO; 
    } 
    return YES; 

} 

但有趣的是,這只是第二次工作,我滑動UISlider。第一次刷卡始終轉到gesturerecognizer處理程序。

爲什麼?以及如何解決這個問題?

謝謝。

回答

1

在你shouldReceiveTouch方法,加入這一行:

NSLog(@"touch.view class = %@", [touch.view className]); 

這表明你在說什麼初始觸摸的類名。

您還應該查看phase屬性;滑動完成後,您可能只想返回YES(取決於您的應用程序的工作方式)。

+0

剛剛檢查過它。日誌說UIView。順便說一句,我用[touch.view類],沒有該視圖的className屬性。不知道如何繼續。 UISlider位於self.view中的另一個UIView內。這可能是原因嗎?如果是這樣,我該如何糾正?任何想法? – GeneCode

+0

是的,所以我刪除了子視圖中的滑塊,現在它工作正常。想知道是否可以檢查另一個視圖中的滑塊。不管怎麼說,多謝拉! – GeneCode

+0

沒有。其實它沒有工作。無論滑塊是否位於子視圖內,第一個視圖仍然會被檢測爲UIView事件,儘管我小心翼翼地觸摸了UISlider。我會調查更多...希望我能找到一些東西。 – GeneCode

2

在滑塊上添加一個平移手勢識別器,但不指定目標和選擇器 (它阻止其他手勢識別器工作) 將屬性設置爲NO允許滑塊正確跟蹤。

UIPanGestureRecognizer* panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:nil action:nil]; 
[slider addGestureRecognizer:panGesture]; 
panGesture.cancelsTouchesInView = NO; 

就是這樣!

+0

這對我有用。謝謝 –

+0

@Mayosse傑出的答案。我的挑戰是在用戶在屏幕上完成滑動之前滑塊保持停止狀態。這完全解決了問題!謝謝! – kbpontius