检测iPhone上的长按

时间:2010-10-25 10:59:34

标签: iphone objective-c cocoa-touch uikit ios

我正在开发一款iPhone应用程序,它要求我检查按钮是否已被轻敲。按住6秒钟&然后开一个播放某种声音的动作。

我应该如何检测这6秒钟?

另一方面,用户还可以持续按下按钮6秒钟。然后同样的行动应该开火。

我应该怎样处理多个水龙头,我怎么知道所有的水龙头都在6秒左右?

3 个答案:

答案 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之后,有多种策略用于处理识别手势结束的时间。一种方法是检查minimumTappingDurationtouchesBegan: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");
    }
}