2011-04-25 89 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; 
}