2010-10-12 96 views
12

我試圖處理觸摸事件touchesBegan覆蓋父母UIView,但也允許觸摸輸入傳遞到兄弟UIView s下面。我預計會有一些直接的方法來處理觸摸事件,然後說「現在將它發送給下一個響應者,就好像這個響應者不存在一樣」,但我能找到的方法似乎是給予將父項返回到覆蓋視圖。那父母並沒有真的把它傳遞給覆蓋視圖的下一個兄弟,所以我不能確定如何做一個簡單的任務,通常通過觸摸回調來實現,該回調獲得True或False返回值來告訴它是否繼續處理小部件層次結構。將觸摸事件傳遞給適當的兄弟UIViews

我錯過了一些明顯的東西嗎?

回答

3

最後答案,但我認爲你最好是覆蓋hitTest:withEvent:而不是touchesBegan。在我看來,touchesBegan是一個非常「高級」的方法,只是做一件簡單的事情,所以如果事件進一步傳播,那麼您不能在該級別進行更改。正確的地方是hitTest:withEvent:

有關此點的更多詳細信息,請參見this S.O. answer

1

我瞭解你正在尋找的期望行爲Joey - 我還沒有在API中找到支持這種自動消息傳遞的兄弟姐妹視圖的鏈式行爲。

我最初在下面寫的是關於只通知父母UIView關於觸摸。這仍然適用,但我相信你需要更進一步,並讓父UIView使用命中測試技術,塞爾吉奧在它的每個子視圖上描述覆蓋層的兄弟,並讓父UIView手動調用「do它的每個子視圖都通過了命中測試。這些同級視圖中的每一個都可以返回布爾值,以確定是否要中止通知其他同級或繼續鏈。

如果你發現自己使用這種模式很多,可以考慮在UIView上添加一個類別方法,它封裝了命中測試並要求視圖執行一個選擇器。

我原來的答覆

手工工作的一點點,就可以連接到一起這個自己。我必須這樣做,並且它對我很有用,因爲我有一個經常重複的用例(一個按鈕上的覆蓋視圖),創建一些自定義類是有意義的。如果你的情況相似,其中一種技術就足夠了。

選項1: 如果覆蓋不需要做任何事情,但看起來很漂亮,有它退出觸摸與userInteractionEnabled = NO完全處理的。這將使觸摸事件轉到它的父UIView(它是覆蓋層)。

選項2: 有覆蓋吸收觸摸事件(因爲它會默認設置),然後調用上的指示觸摸或特定手勢被認定父UIView的一個方法,這裏是它是什麼。這樣,疊加層後面的UIView仍然會對觸摸識別起作用,即使其他人進行了攔截。

使用選項2,它更適合於簡單的UIControlEvent類型,如UIControlEventTouchDownUIControlEventTouchUpInside。在我的情況下(一個定製的UIButton子類,在它上面有一個自定義的覆蓋視圖),我會觸摸並觸摸按鈕上的事件爲兩個單獨的方法。如果在按鈕本身發生觸摸或觸發內部事件,則會觸發這些事件。但是,如果我需要模擬發生按鈕按下,它們也是我可以從覆蓋視圖調用的鉤子。

根據您的需求,你可以有覆蓋層之間的已知協議和它的父UIView的或只是有覆蓋非正式測試的UIView,具有respondsToSelector:檢查就可以調用performSelector:與要叫那會自定義方法之前如果UIView沒有覆蓋,它會自動觸發。