2011-04-25 87 views
1

我想要一個定時器來重置每次用戶在我的應用程序中觸摸屏幕(所以我知道用戶仍在使用該設備)。我在ViewController中實現了touchBegan。捕獲UIView中的所有觸摸事件?

問題是如果我有我的ViewController中的UITableView和用戶觸及UITableView的功能touchBegan永遠不會被調用。原因是tableView不會傳遞觸摸事件。

我明白你可以將UITableView的子類傳遞給它的超級視圖,或者在頂部添加一個透明的UIView,它只捕獲觸摸事件並傳遞它們。子類化的問題是我需要在捕獲觸摸事件的所有類上執行此操作。

有沒有更好的解決方案?如果不是,你如何將事件傳遞給它的超級視圖?

回答

2

關閉我的頭頂,你可以繼承UIWindowUIApplication並覆蓋sendEvent:(UIEvent *)event並從那裏採取行動。

e.x. (如果您覆蓋UIApplication

- (void)sendEvent:(UIEvent *)event { 
    if (event.type == UIEventTypeTouches) 
     [(YourApplicationDelegate *)self.delegate wakeUp:event]; 
    [super sendEvent:event]; 
} 

這可能對您嘗試執行的操作有點侵入性。很想看到其他一些想法。

+0

它實際上像我想要的那樣工作,問題是我似乎找不到檢測它是否觸摸的方法。 Atm如果我在滾動視圖中滾動wakeUp被稱爲20-30次。 – David 2011-04-25 12:16:41

+0

回答我自己的問題:UITouch * touch = [event allTouches] .anyObject; if(touch.phase == UITouchPhaseBegan){ – David 2011-04-25 16:43:00

+0

這不再適用於我在iOS7中。請參閱下面的答案,瞭解我是如何運作的。 – 2014-01-30 23:58:37

0

我不認爲你應該子類UIScrollView(或UITableView - 從UIScrollView延伸)只是爲了處理觸摸事件,因爲還有其他方式來完成你可能在尋找一個更乾淨的方式。

當使用UISCrollViewMKMapView(它也不會傳遞觸摸事件)時,我通常使用UIGestureRecognizer來捕獲我正在尋找的特定觸摸事件。

對於一些特殊情況下,如處理一個UITableView的觸摸屏幕只是解僱鍵盤,我的UIScrollView屬性userInteractionEnable設置爲NOtextViewDidBeginEditingUITextView委託方法,然後在textViewDidEndEditing設置userInteractionEnableYES。這樣做可以讓我在沒有任何子類化的情況下捕獲touchesBegan

1

上述解決方案不再與iOS 7

工作,如果你只是想知道,當屏幕被感動了,把你的ViewController.m文件中的以下...

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer 
               shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer 
{ 
    if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
    // yes, it was touched! 
    } 
    return YES; 
}