2012-01-31 37 views
0

我一直在尋找解決方案,並且一直沒找到答案。如果之前有人問過,mayboe有人可以指出,或者幫助我提出一個想法。只要用戶正在互動,就可以顯示菜單

我有UIViewController託管自定義視圖。第一個自定義視圖是全屏。第二個自定義視圖實際上是一個從屏幕底部滑入視圖的菜單,類似於具有自定義動畫的工具欄,然後它應滑出。

當前確認:延遲後菜單滑入視圖(出現視圖後),並且NSTimer開始計數。它在視圖中保持幾秒鐘,直到NSTimer啓動另一種方法,並且該方法將菜單撤回。

一切工作正常。

我想要什麼:如果用戶啓動與菜單交互,撥動開關,滑塊等,我希望菜單留在視圖中,延遲的NSTimer的發射,直到用戶完成交互。然後縮回菜單。

爲了實現這一點,我在將菜單滑入視圖的方法中使用了NSTimer,以啓動X毫秒後縮回菜單的另一種方法。

在收回菜單的方法中,我使計時器無效。

我覆蓋了tocuhesBegan方法,以查看交互區域是否落入菜單的邊界內,如果是,則將NSTimer重置爲另一X毫秒。

問題:如果用戶觸摸菜單的背景,這是好的,但如果用戶與菜單內的開關,按鈕和幻燈片交互時,menu.view不註冊的觸摸,這是有意義的,因爲它們是前線和耗盡觸摸事件,所以觸摸事件不會傳遞到層次結構中。但另一方面,這是我的問題!

我不能覆蓋menu.view中每個元素的每個touchesBegan方法。我還可以註冊menu.view區域內發生的那些觸摸嗎?

我試過locationInView:nil在窗口內觸摸,但沒有註冊與按鈕和滑塊等的交互。

謝謝。

回答

1

捕獲視圖層次結構中出現的所有觸摸事件的一種解決方案是提供自定義UIWindow實現並覆蓋sendEvent方法。所有事件首先由UIApplication接收,然後分派到UIWindow,然後發送到包含觸摸點的UIView。通過在UIWindow級別捕獲事件,可以確保您可以攔截每個事件而不必重寫每個控件。

創建自定義UIWindow類並實現sendEvent這樣的:

- (void)sendEvent:(UIEvent *)event 
{ 
    // Notify app to reset menu timer 
    // ... 

    [super sendEvent:event]; 
} 

改爲使用香草一個取決於你的UI是如何實現的自定義一個UIWindow。如果使用的是故事板,那麼你需要實現應用程序委託一個window getter方法是這樣的:

- (UIWindow*)window 
{ 
    if (!_window) { 
     _window = [[CustomWindow alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
    } 

    return _window; 
} 

否則創建一個UIWindow,而不是標準之一,應用程序委託的application:didFinishLaunchingWithOptions:方法定製的一個實例。

您有幾個接收觸摸事件通知的選項。您可以使用NSNotificationCenter發送和訂閱自定義通知,或者您可以在自定義UIWindow上實現委託屬性,並將您的UIViewController設置爲委託以接收觸摸事件通知。

+0

謝謝。我會給它一個鏡頭。順便說一句,你對我的方法有什麼想法?它聽起來不錯嗎?或者有更好的方法? – Canopus 2012-01-31 20:19:15

+0

對我來說這聽起來是明智的做法 - 我在其中一個UI中做了類似的事情。 – 2012-01-31 20:39:33