我正在开发一款iPhone应用程序,它要求我检查按钮是否已被轻敲。按住6秒钟&然后开一个播放某种声音的动作。
我应该如何检测这6秒钟?
另一方面,用户还可以持续按下按钮6秒钟。然后同样的行动应该开火。
我应该怎样处理多个水龙头,我怎么知道所有的水龙头都在6秒左右?
答案 0 :(得分:17)
长按六秒钟,请使用UILongPressGestureRecognizer
,其minimumPressDuration
属性设置为6。
编写您自己的gesture recognizer(例如LongTappingGestureRecognizer
),以便在给定时间内连续点击;它不应该太棘手。给它一个属性,比如UILongPressGestureRecognizer
的{{1}}(比如说,minimumPressDuration
)和一个属性(比如minimumTappingDuration
),它决定了手指在它之前被抬起的时间长度。不被认为是一个长期的敲击手势。
touchesBegan:withEvent:
时,请记录时间。touchesEnded:withEvent:
后,启动NSTimer
(提升计时器),在maximumLiftTime
之后向手势识别器发送取消信息(例如cancelRecognition
)。 maximumLiftTime
,取消提升计时器(如果有)。 touchesBegan:withEvent:
将转换为failed state。在cancelRecognition
之后,有多种策略用于处理识别手势结束的时间。一种方法是检查minimumTappingDuration
和touchesBegan:withEvent:
处理程序,如果当前时间和开始时间之间的差异是> = touchesEnded:withEvent:
。这样做的问题是,如果用户正在慢慢点击并且在达到minimumTappingDuration
时手指按下,则识别手势的时间将超过minimumTappingDuration
。另一种方法是在收到第一个minimumTappingDuration
时启动另一个NSTimer(识别计时器),一个将导致转换到recognized state并在touchesBegan:withEvent:
中取消的NSTimer。这里很棘手的事情是如果在计时器开火时手指被抬起该怎么办。最好的方法可能是两者的结合,如果手指抬起则忽略识别计时器。
细节还有更多,但这就是要点。基本上,它是一种长按识别器,可让用户将手指从屏幕上抬起一小段时间。您可能只使用点击识别器并跳过长按识别器。
答案 1 :(得分:11)
我意识到这是一个过时的问题,但答案应该很简单。
在您的视图控制器中 viewDidLoad :
//create long press gesture recognizer(gestureHandler will be triggered after gesture is detected)
UILongPressGestureRecognizer* longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
//adjust time interval(floating value CFTimeInterval in seconds)
[longPressGesture setMinimumPressDuration:6.0];
//add gesture to view you want to listen for it(note that if you want whole view to "listen" for gestures you should add gesture to self.view instead)
[self.m_pTable addGestureRecognizer:longPressGesture];
[longPressGesture release];
然后在 gestureHandler :
中-(void)gestureHandler:(UISwipeGestureRecognizer *)gesture
{
if(UIGestureRecognizerStateBegan == gesture.state)
{//your code here
/*uncomment this to get which exact row was long pressed
CGPoint location = [gesture locationInView:self.m_pTable];
NSIndexPath *swipedIndexPath = [self.m_pTable indexPathForRowAtPoint:location];*/
}
}
答案 2 :(得分:0)
这是我的解决方案。
- (IBAction) micButtonTouchedDownAction {
self.micButtonTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(micButtonAction:) userInfo:nil repeats:YES];
self.micButtonReleased = FALSE;
}
- (IBAction) micButtonTouchedUpInsideAction {
self.micButtonReleased = TRUE;
}
- (IBAction) micButtonTouchedUpOutsideAction {
self.micButtonReleased = TRUE;
}
- (void) micButtonAction:(NSTimer *)timer {
[self.micButtonTimer invalidate];
self.micButtonTimer = nil;
if(self.micButtonReleased) {
NSLog(@"Tapped");
}
else {
NSLog(@"Touched");
}
}