обнаружение долгого нажатия на iPhone - PullRequest
6 голосов
/ 25 октября 2010

Я работаю над приложением для iPhone, которое требует, чтобы я проверял, было ли нажато кнопку и удерживали ее нажатой в течение 6 секунд, а затем запускаю действие, которое воспроизводит какой-то звук.

Как мне обнаружить этот 6-секундный сигнал?

С другой стороны, пользователь также может удерживать нажатой кнопку в течение 6 секунд, после чего должно произойти то же действие.

Что мне делать с несколькими нажатиями, откуда мне знать, что все ответвления попадают под 6-секундную скобку?

Ответы [ 3 ]

17 голосов
/ 25 октября 2010

Для длинного нажатия на шесть секунд используйте UILongPressGestureRecognizer со свойством minimumPressDuration, установленным на 6.

Напишите свой собственный распознаватель жестов (скажем, LongTappingGestureRecognizer) для непрерывного постукивания в течение заданного периода; это не должно быть слишком сложно. Присвойте ему свойство, такое как UILongPressGestureRecognizer minimumPressDuration (скажем, minimumTappingDuration) и свойство (скажем, maximumLiftTime), которое определяет, как долго можно отрывать палец, прежде чем он не будет считаться длинным касанием. .

  • Когда он впервые получит touchesBegan:withEvent:, запишите время.
  • Когда он получает touchesEnded:withEvent:, запускается NSTimer (таймер подъема), который отправляет распознавателю жестов сообщение об отмене (например, cancelRecognition) после maximumLiftTime ,
  • Когда он получает touchesBegan:withEvent:, когда есть время начала, отмените таймер подъема (если есть).
  • cancelRecognition перейдет в сбойное состояние .

Существуют различные стратегии обработки распознавания, когда достигнут конец жеста после minimumTappingDuration. Один из них - проверить в обработчиках touchesBegan:withEvent: и touchesEnded:withEvent: разницу между текущим временем и временем запуска> = minimumTappingDuration. Проблема в том, что распознавание жеста займет больше времени, чем minimumTappingDuration, если пользователь медленно нажимает, а при достижении minimumTappingDuration палец не нажимает. Другой подход заключается в запуске другого NSTimer (таймера распознавания) при получении первого touchesBegan:withEvent:, который вызовет переход в распознанное состояние и отменен в cancelRecognition. Самое сложное в том, что делать, если при срабатывании таймера палец поднимается. Наилучшим подходом может быть комбинация двух, игнорирование таймера распознавания, если палец поднят.

Есть еще детали, но это суть. По сути, это распознаватель длинных нажатий, который позволяет пользователю на короткое время убирать палец с экрана. Вы можете использовать только распознаватель касаний и пропустить распознаватель длинных нажатий.

11 голосов
/ 07 февраля 2013

Я понимаю, что это довольно устаревший вопрос, однако ответ должен быть довольно простым.

В вашем контроллере View 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];

Тогда в вашем gestHandler :

-(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];*/
    }
}
0 голосов
/ 19 апреля 2012

Вот мое решение.

- (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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...