找出是否没有接触过?

时间:2013-04-03 21:34:01

标签: ios objective-c

我知道可以使用

检测iOS上的触摸
UITouch *touch = [[event allTouches] anyObject];

但是,是否可以找出用户何时不接触?

修改

我想要一个方法在用户没有触摸屏幕5秒钟时执行。这可能吗?

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

-touchesBegan
-touchesMoved and
-touchesEnded

更具体地说,用户可以根据需要多次触摸屏幕,因为他想要多长时间。但是,当用户未触摸屏幕的时间超过5秒时,则需要触发方法-sampleMethod

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我打算回答一下这里的答案。因为在评论中你澄清了你想要做的事情。 5秒后没有任何反应的东西。我在这里展示的内容通常用于我所有应用程序都在的opengl应用程序中。但是即使你没有处于开放状态,类似的东西应该适合你。

你需要一些不断运行的东西......

    - (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是什么时候我可以有基于时间的东西以及基于触摸的东西。

答案 2 :(得分:0)

当然,剩下的时间。你什么意思?唯一的方法是将布尔标志设置为false,并在“触摸”方法中将其设置为true。然后,只要它是假的,就没有触摸......

答案 3 :(得分: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];
}