touchesBegan не всегда отвечает

#iphone #touch #swipe #touchesbegan

#iPhone #коснитесь #проведите пальцем #touchesbegan

Вопрос:

Я обнаруживаю свайп на экране, и это работает именно так, как я хочу. Единственное, при тестировании я продолжаю прокручивать снова и снова, и по крайней мере в 90% случаев или чаще он отвечает, но время от времени ответа нет.

Я записал все, чтобы найти виновника, и обнаружил, что touchesBegan вообще не обнаруживается в те несколько раз, когда это происходит.

Вот мой код, хотя touchesBegan даже не вызывается, поэтому код не должен иметь значения:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touches began!");
    UITouch *touch = [touches anyObject];
    CGPoint thisTouch = [touch locationInView:self.view];

    touchstartedX = thisTouch.x;
    touchstartedY = thisTouch.y;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    CGPoint p = [[touches anyObject] locationInView:self.view];

    if ((abs(p.y - touchstartedY)) < 120) {
        if ((p.x - touchstartedX) > 10) {
            [self goPrevious];
        } else if ((p.x - touchstartedX) < -10) {
            [self goNext];
        } 
    } else { NSLog(@"too much Y"); }
} 
  

Есть идеи?

Спасибо!

* РЕДАКТИРОВАТЬ С ПОМОЩЬЮ РЕШЕНИЯ * Вот код, который я в конечном итоге использовал после изучения UISwipeGestureRecognizer по предложению dredful:

в .h:

 UIViewController <UIGestureRecognizerDelegate>

UISwipeGestureRecognizer *swipeLeft;
UISwipeGestureRecognizer *swipeRight;

@property (nonatomic, retain) UISwipeGestureRecognizer *swipeLeft;
@property (nonatomic, retain) UISwipeGestureRecognizer *swipeRight;
  

в .m:

 @synthesize swipeLeft, swipeRight;

UIGestureRecognizer *recognizer;
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    self.swipeLeft = (UISwipeGestureRecognizer *)recognizer;
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    self.swipeLeft = (UISwipeGestureRecognizer *)recognizer;
    [recognizer release];

    recognizer;
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    self.swipeRight = (UISwipeGestureRecognizer *)recognizer;
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight; 
    self.swipeRight = (UISwipeGestureRecognizer *)recognizer;
    [recognizer release];

    [self.view addGestureRecognizer:swipeLeft];    
    [self.view addGestureRecognizer:swipeRight];

- (void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {

    if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
        [self goNext];
    } else {
        [self goPrevious];
    }
}

- (void)dealloc
{
    [swipeLeft release];
    [swipeRight release];
    [super dealloc];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.swipeLeft = nil;
    self.swipeRight = nil;
}
  

Ответ №1:

Гораздо проще использовать Apple UISwipeGestureRecognizer

 // add Swipe Left
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeLeft:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeft];
[swipeLeft release];

// add Swipe Right
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeRight:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:swipeRight];
[swipeRight release];


- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)recognizer {
    //do something
}

- (void)handleSwipeRight:(UISwipeGestureRecognizer *)recognizer {
    //do something
}
  

Комментарии:

1. Рад, что это помогло. Apple действительно добилась успеха с распознавателями жестов. Делает нашу жизнь намного проще.