Распознаватель жестов в IOS - PullRequest
0 голосов
/ 18 января 2012

У меня есть этот код в LongTapGestureRecognizer для автоматической прокрутки представления:

-(void) longPressDetectedgesture:
        (UILongPressGestureRecognizer*)recognizer
{
    _btnautoscrollstop.hidden = NO;
    _btnautoscroll.hidden = YES;

    // if (autoscrollTimer == nil) { 

    autoscrollTimer = [NSTimer 
        scheduledTimerWithTimeInterval:(55.0/1000.0) 
        target:self 
        selector:@selector(autoscrollTimerFired:)  
        userInfo:nil  
        repeats:YES]; 
}
- (void)autoscrollTimerFired:(NSTimer*)timer { 
    CGPoint scrollPoint = self.table.contentOffset; 
    scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 1); 
    [self.table setContentOffset:scrollPoint animated:NO]; 
}

Это прекрасно работает для меня, но мне нужно, чтобы автозамена была остановлена, когда пользователь во второй раз касается экрана Longgestureи наоборот.Как остановить это, когда пользователь нажимает второй раз.

Ответы [ 3 ]

0 голосов
/ 18 января 2012

Что я обычно делаю, так это объявляю глобальный BOOL Alter;и инициализировать его Alter = NO;во viewDidLoad (или любом другом методе) затем

-(void) longPressDetectedgesture:(UILongPressGestureRecognizer*)recognizer
{
    if(Alter)
    {
      Alter = NO;
      [autoscrollTimer inValidate];
    }
    else
    {
       Alter = YES;
       _btnautoscrollstop.hidden = NO;
       _btnautoscroll.hidden = YES;

     // if (autoscrollTimer == nil) { 

     autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:(55.0/1000.0) 
                                                   target:self 
                                               selector:@selector(autoscrollTimerFired:)  
                                                 userInfo:nil  
                                                  repeats:YES]; 
    }
}
0 голосов
/ 18 января 2012

создайте BOOL с именем shouldFireTimer в viewDidLoad или аналогичном и обновляйте его значение каждый раз, когда вы обнаруживаете длинное нажатие

-(void) longPressDetectedgesture: (UILongPressGestureRecognizer*)recognizer {
    _btnautoscrollstop.hidden = NO;
    _btnautoscroll.hidden = YES;
    if ( shouldFireTimer ) {
        [autoscrollTimer invalidate];
        autoscrollTimer = nil;
    } else {
        autoscrollTimer = [NSTimer 
            scheduledTimerWithTimeInterval:(55.0/1000.0) 
            target:self 
            selector:@selector(autoscrollTimerFired:)  
            userInfo:nil  
            repeats:YES]; 
    }
    shouldFireTimer = !shouldFireTimer;
}

- (void)autoscrollTimerFired:(NSTimer*)timer { 
     CGPoint scrollPoint = self.table.contentOffset; 
     scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 1); 
     [self.table setContentOffset:scrollPoint animated:NO]; 
}

или, как сказал Мэтт выше, возможно, просто проверьте нулевой статус вместо использования BOOL. Я предлагаю использовать BOOL, так как вы, возможно, запускаете autoscrollTimerFired и в других обстоятельствах (например, с помощью кнопки), т. Е. Когда вы хотите вызвать его, он может быть не равен нулю.

0 голосов
/ 18 января 2012

Похоже, ты почти у цели.Вы, вероятно, хотите что-то вроде этого:

if (recogniser.state == UIGestureRecognizerStateBegan) {
    if (autoscrollTimer == nil) { 
        autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:(55.0/1000.0) 
                                                           target:self 
                                                         selector:@selector(autoscrollTimerFired:)  
                                                         userInfo:nil  
                                                          repeats:YES];
    } else {
        [autoscrollTimer invalidate];
        autoscrollTimer = nil;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...