2016-12-12 71 views
1

我知道觸摸事件可以傳遞到點擊視圖或手勢。但我的東西在我的演示混淆了一些:UIGestureRecognizer如何與UIResponder鏈一起使用?

我在我的根視圖中有兩個子視圖,一個是testView(UIView的子類),另一個是testBtn(UIButton),其操作是「testBtnClicked」。然後,我將UITapGestureRecognizer添加到我的根視圖,並將其操作設置爲「tapAction」。

問題就來了:

當我觸摸根視圖

,它觸發 「touchsBegan:withEvent:方法」, 「tapAction」 和 「touchsCancelled:withEvent」 的方法。這就是我的預期;

當我觸及testView時,它和上面的一樣;

當我觸及testBtn時,它只觸發了「testBtnClicked」方法。爲什麼?

爲什麼當我觸及testView而不是根視圖時手勢被識別?以及爲什麼當我觸及testBtn時無法識別它?

回答

4

啊哈!可能是我得到了答案:

首先,gestureRecognizers得到識別觸摸的第一個機會,因爲在App醫生說:

窗口延遲觸摸對象的傳遞給視圖,以便手勢識別器可以先分析觸摸。在延遲期間,如果手勢識別器識別出觸摸手勢,則該窗口永遠不會將觸摸對象遞送到視圖,並且還取消其先前發送到該視圖的任何觸摸對象,該視圖是該識別序列的一部分。

其次,在iOS系統6.0及更高版本,UIButton的行動防止重疊手勢識別的行爲,也爲蘋果醫生說:

在iOS系統6.0及更高版本,默認的控制動作,以免造成重疊手勢識別行爲。例如,按鈕的默認操作是單擊。如果您將一個輕擊手勢識別器附加到按鈕的父視圖,並且用戶點擊該按鈕,則按鈕的操作方法將接收觸摸事件而不是手勢識別器。這僅適用於手勢識別重疊用於控制默認操作,其包括:

  • 單個手指單次敲擊上一個UIButton,UISwitch,UIStepper, UISegmentedControl,和UIPageControl。
  • 單指在平行於滑塊的方向上滑動UISlider的旋鈕。
  • UISwitch的旋鈕上的單指平移手勢,其方向與開關平行。

如果你有這些控件的一個自定義子類,要更改默認操作,直接連接一個手勢識別來控制,而不是父視圖。然後,手勢識別器首先接收觸摸事件。與往常一樣,請務必閱讀iOS人機界面指南,以確保您的應用程序提供直觀的用戶體驗,特別是在覆蓋標準控件的默認行爲時。

相關問題