2011-03-04 32 views
0

我有一個可用的選項卡欄應用程序。每個標籤是一個UINavigationController,其根視圖是某種UIViewController,通常是UITableViewController全屏UIView子類作爲不消耗觸摸事件的面紗

在應用程序中有一些情況下,我想顯示一個全屏「面紗」,並顯示有關正在發生的事情的消息,直到某個操作完成。關鍵是要吞噬任何接觸操作開始的用戶界面。

面紗是一個UIView子類。這個類有一個單例實例。顯示時,我將其作爲UITabBarController視圖的子視圖插入。該視圖出現在整個用戶界面上,包括標籤欄。大!

這是問題所在。我可以點擊標籤和UI更改。我本來期望的是,我的面紗觀只會吞噬一切。

我已經在我的面紗類中實現了各種觸摸{開始|結束|移動|取消}方法(作爲無所事事的方法),但觸摸仍然由標籤欄拾取,坦然地被任何對象無論我碰到什麼。

我也嘗試覆蓋一些其他方法,包括nextResponder,hitTest:withEvent :,等,無濟於事。

我在這一點上有點難住。我希望有人會有一些聖人的建議。 :-)

謝謝。

回答

3

修改框架類的視圖層次結構是不安全的。你可以更好地將它添加爲窗口本身的子視圖。至於消費觸摸,如果進行此更改不起作用,那麼您還應該驗證在視圖上​​userInteractionEnabled設置爲YES。您不必實際實施任何觸摸相關的方法。

+0

@ Kevin-Ballard:謝謝你。所以我按照你的建議達到了同樣的視覺效果:將面紗作爲委託人窗口的子視圖。而且,面紗的'userInteractionEnabled'標誌被設置爲YES。我評論了觸控處理方法的空實現。這些觸動繼續傳遞到基本觀點。任何其他想法? – 2011-03-04 20:44:14

+0

@MarkGranoff:我認爲它也會失敗,如果你留下null實現?你把它插在窗口的根部?我可以爲你的行爲考慮的最可能的原因是,如果一個超級視圖有一個UIGestureRecognizer,但是如果你在窗口的根目錄,那麼情況並非如此。我唯一能想到的其他事情就是你的阿爾法。您是否在視圖中設置了「alpha」屬性?如果'alpha'爲'0.05'或更少,觸摸跳過視圖。它應該設置爲'1',你的視圖應該沒有背景色。 – 2011-03-04 20:48:39

+0

@ Kevin-Ballard:是的,有或沒有空實現,相同的行爲。沒有使用UIGestureRecognizers,至少我沒有明確表示。 alpha屬性設置爲0.65。所以我將它設置爲1,並使用clearColor,以便我可以看到可能發生的情況。仍然失敗。順便說一句,這個視圖是用這樣的代碼插入的[[myApp delegate] .window addSubview:[Veil theVeil]]'。這當然有效(我看到了面紗),我想不出以另一種方式「以正確的方式」。真是奇怪。 – 2011-03-04 20:58:21

1

我也有這個問題,並提出了一個hacky的解決方案。在您的自定義UIView類的init中,創建一個不可能命中的虛擬UIView,例如[[UIView alloc] initWithFrame:CGRectMake(-1, -1, 0, 0)]。或者實際上,我認爲任何UIView不附加到窗口的作品。然後,在hitTest:withEvent:中,讓它返回不在您感興趣的區域中的每個點的虛擬視圖。