2015-02-24 42 views
0

這是一個相當假設的問題,只是爲了理解正確的設計,但可以說我有兩個自定義的UIViews。正確的UIGestureRecognizer和委託設計

其中之一基本上是我會打電話給一個抽屜的容器。其目的是隱藏和顯示內容。這很像iOS上的通知中心,您可以通過滑動將其打開並彈回以關閉它。它是一個通用容器,可以包含任何其他UIView。它有一個UIPanGestureRecognizer來跟蹤拉開它的手指。它也可能有一個UISwipeGestureRecognizer來檢測「輕彈」。

另一種觀點是,具有UIPan /旋轉/捏GestureRecognizers定製地圖工具。

我認爲抽屜視圖應該是Pan/Swipe GestureRecognizers的UIGestureRecognizerDelegate,這樣它可以防止觸摸被傳遞,除非用戶抓住「手柄」。

我的第一個直覺是地圖是平移/旋轉/捏手勢的UIGestureRecognizerDelegate,以便它可以允許它們全部同時運行。

我遇到的問題是,我真的不希望地圖接收任何接觸或開始識別姿勢,直到抽屜是完全開放的。我希望能夠在抽屜本身自動執行此行爲,以便它可以立即適用於所有子視圖。

我能想到做到這一點的唯一方法是將所有的手勢處理程序連接到ViewController並讓它做所有事情,但是對於打破封裝的我來說,它必須知道地圖手勢需要運行同時,抽屜只能觸及它的手柄,並且地圖只有在打開時才能觸及。

什麼是這樣做,其中的邏輯可以留在地方意見,我認爲它屬於的一些方法?

回答

0

我會做這樣的事情,使抽屜的同時平移禁用子視圖。本質上循環抽屜的子視圖和對它們的惡意交互。

[self.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop){ 
    subview.userInteractionEnabled = NO; 
}]; 

而且當你想重新啓用子視圖上的用戶交互時,又有類似的東西。

+0

我不能說這個解決方案不起作用,但它不在可用的手勢工具中。那是因爲Superviews沒有適當的方式來控制他們的Subviews手勢行爲(除了作爲代表)嗎? – cjserio 2015-02-25 12:23:09

0

這應該已經是Just Work™了。手勢識別器附加到視圖;當連續手勢被識別時,與該手勢相關聯的所有後續觸摸與該視圖相關聯。

因此,在您的情況下,當識別出抽屜平底鍋時,與該平底鍋相關的任何觸摸都不應該導致您的地圖視圖的平移/捏合/旋轉手勢發生行爲(除非您明確指定他們應使用適當的委託方法) 。

或者你的意思是你想阻止,中途用戶通過打開抽屜,用另一個手指(即另一種姿態)開始滾動(半可見)的地圖?如果是這樣,您應該在抽屜的contentView(或等效)上設置userInteractionEnabled,將NO設置爲UIGestureRecognizerStateBegan/ChangedYES,再次設置爲UIGestureRecognizerStateEnded/Cancelled

+0

實際使用情況是,由於從前一手指拖動/滑動給出的速度,抽屜正在移動(沒有觸摸)的過程中......然後,用戶停止抽屜移動並觸摸激活地圖拖動的地圖(小孩)...因此不是停止抽屜關閉,而是平移地圖並且抽屜繼續關閉。這聽起來像你的第3段更適用,你建議的東西非常類似於在他的答案中做的lramirez135。這似乎是有道理的,所以我認爲我需要給他信貸。但謝謝你澄清。 – cjserio 2015-03-03 12:38:22