2013-06-02 71 views
27

我有一個UIScrollView到我添加了一個單一的水龍頭手勢識別顯示/隱藏一些UI重疊使用:滾動型手勢識別吃所有觸摸事件,

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
[scrollView addGestureRecognizer:singleTap]; 

和:

- (void)handleTap:(UITapGestureRecognizer *)sender { 
    // report click to UI changer 
} 

我加easy table viewUIScrollView的底部。一切工作正常(水平和垂直滾動),但問題是,只有手勢識別器(上面)才能識別敲擊,但不能通過簡單的表格視圖識別。 如果我刪除註冊手勢監聽器的行,一切正常,表視圖通知自己點擊。

就好像手勢識別器功能在桌面視圖上「吃掉」龍頭事件並不會向下傳播它們。

任何幫助表示讚賞

回答

61

這應該解決您的問題。
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
這個想法是告訴手勢識別器不要吞噬觸摸事件。爲此,您需要將singleTap的cancelsTouchesInView屬性設置爲NO,默認爲YES

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
singleTap.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTap]; 
+1

這樣做的技巧:) –

+2

我有類似的問題([我的問題](http://stackoverflow.com/questions/33105678/in-ios-button-tapping-not-fired-when-keyboard-is-可見)),但解決方案不適合我。有時候這個事件會被解僱,有時候不會。 – new2ios

+1

那一個是最終解決方案。謝謝zambrey –

5

您可以設置哪些對象將被包含/排除觸摸。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {    
    if (touch.view == [self view]) { 
     return YES; 
    } 
    return NO; 
} 
5

我想原因是User Interaction Enabled設置爲false爲的UIImageView。你應該把它設置爲true,以使在它攻

2

感謝@zambrey

斯威夫特2.2+版本:

scrollView.delegate = self 

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed)) 
allowMultipleTouches.numberOfTapsRequired = 1 
allowMultipleTouches.cancelsTouchesInView = false 

scrollView.addGestureRecognizer(allowMultipleTouches) 

如果你的滾動視圖是在故事板,不要​​忘了在視圖控制器中固定出口。在這個例子中,scrollViewUIScrollView的出口。

1

TapGestures爲我工作。另一方面,滑動,我不得不禁用滾動,它的工作。

 swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    swipeLeftGesture.direction = .left 
    scrollView.addGestureRecognizer(swipeLeftGesture) 

    swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    scrollView.addGestureRecognizer(swipeRightGesture) 

    scrollView.isScrollEnabled = false 
5

夫特3.0

let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) 
singleTap.cancelsTouchesInView = false 
singleTap.numberOfTapsRequired = 1 
scrollView.addGestureRecognizer(singleTap) 

和選擇方法是怎樣的。

func handleTap(_ recognizer: UITapGestureRecognizer) { 
    // Perform operation 
} 
+0

完美的解決方案! –

1

您可以在UIscrollView中捕捉任何類型的手勢。確保你也處理一些默認屬性,就像設置cancelsTouchesInView屬性爲false,默認情況下是true。 還給你的子視圖一些標籤號來區分選擇器。 &也使他們的用戶交互爲真。

讓自來水= UITapGestureRecognizer(目標:自我,動作:

選擇(didTapByUser(_ :)))

1

這工作對我來說斯威夫特3/Xcode中8

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **) 
    self.scrollView.canCancelContentTouches = false 

祝你好運!

+0

請不要將這條信息留在評論中,請[編輯]你的答案並直接在那裏添加它,然後刪除評論。您也可以抓住機會修復縮進(使用Markdown的代碼格式需要4個空格,但是您有8個空格,導致不必要的額外縮進級別)。謝謝! –