0

我知道可以使用 iOS 检测触摸

UITouch *touch = [[event allTouches] anyObject];

但是,是否有可能找出用户何时不触摸?

编辑

我希望在用户 5 秒内不触摸屏幕时执行一个方法。这可能吗?

我没有任何对触摸做出反应的自定义方法。我只有现有的方法

-touchesBegan
-touchesMoved and
-touchesEnded

更具体地说,用户可以根据需要多次触摸屏幕,持续多久。但是,当用户超过 5 秒没有触摸屏幕时,就-sampleMethod需要触发一个方法。

4

4 回答 4

2

您可以以 5 秒的间隔启动计时器,每次触摸时,重新启动计时器:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.timer invalidate];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(yourMethod) userInfo:nil repeats:NO];
}

- (void)yourMethod {
    NSLog(@"not touched for 5 seconds");
}

根据您的特定需求,您可能希望使用它touchesEnded:withEvent

于 2013-04-03T21:55:44.097 回答
1

我要在这里回答一个问题。因为在评论中你澄清了你想要做什么。5秒后没有反应。我在这里展示的内容通常用于我所有的应用程序都是 opengl 应用程序。但是,即使您不在 open gl 中,它也应该对您有用。

你需要一些持续运行的东西......

    - (void) startAnimation
{
    if (!animating)
    {
        displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(drawView)];
        [displayLink setFrameInterval:animationFrameInterval];
        [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

        animating = TRUE;
    }
}

- (void)stopAnimation
{
    if (animating)
    {
        [displayLink invalidate];
        displayLink = nil;

        animating = FALSE;
    }
}

我们在 oepngl 应用程序中使用它来每隔 60 秒运行一次 drawview 函数,同时刷新显示。我不明白你为什么不能这样做。然后在您的 drawView 方法中检查开始时的时间并处理您需要的任何其他废话,例如在游戏中推进棋子或只是检查消息持续了多长时间..

- (void)drawView
{
timeThisRound = CFAbsoluteTimeGetCurrent();

并针对触发 5 秒开始的任何事件进行检查。如果你已经过了 5 秒,那么就做你想做的任何事情,而不是再等待他们点击按钮。

我有自己的消息系统可以做到这一点。我可以设置任何出现的消息,如果它应该在 5 秒后自行消失。或者,如果他们轻按它,它就会消失得更快。我在任何地方都使用 timeThisRound 方法(一个全局属性)来跟踪 NOW 的时间,这样我就可以拥有基于时间的东西以及基于触摸的东西。

于 2013-04-03T21:55:18.930 回答
0

当然,其余时间。你什么意思?唯一的方法是将布尔标志设置为false,并在您的“touched”方法中将其设置为true。然后任何时候它是假的,没有触摸......

于 2013-04-03T21:36:45.617 回答
0

在一定延迟后启动一个方法,当用户停止触摸视图时启动。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self performSelector:@selector(sampleMethod) withObject:nil afterDelay:5.0f];
}

如果用户再次触摸视图,您应该取消挂起的方法调用

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(sampleMethod) object:nil];
}

记得在 dealloc 中取消挂起的方法调用

- (void)dealloc {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(sampleMethod) object:nil];
}
于 2013-04-03T22:01:01.043 回答