我知道可以使用
检测iOS上的触摸UITouch *touch = [[event allTouches] anyObject];
但是,是否可以找出用户何时不接触?
修改
我想要一个方法在用户没有触摸屏幕5秒钟时执行。这可能吗?
我没有任何可以对触摸做出反应的自定义方法。我只有现有的方法
-touchesBegan
-touchesMoved and
-touchesEnded
更具体地说,用户可以根据需要多次触摸屏幕,因为他想要多长时间。但是,当用户未触摸屏幕的时间超过5秒时,则需要触发方法-sampleMethod
。
答案 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];
}