Проблема двойного нажатия - PullRequest
2 голосов
/ 15 сентября 2011

Я работаю над приложением с функцией масштабирования. В этом приложении у меня есть эта кнопка. Я хочу, чтобы он реагировал на нажатие несколькими способами:

Однократное нажатие: немного увеличить.

Двойное касание: увеличение до макс.

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

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
tapGesture.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:tapGesture];

[zoomin addTarget:self action:@selector(zoominMax) forControlEvents:UIControlEventTouchDownRepeat];

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

Это можно исправить с помощью таймера и проверки местоположения, чтобы при нажатии и повторном нажатии вы могли быть уверены, что местоположение находится в аналогичной области, и касания произошли в пределах диапазона таймера.

Но это то, что мне действительно нужно? Есть ли более простое решение?

Ответы [ 2 ]

5 голосов
/ 13 сентября 2012

решение, предоставленное omz, не очень хорошо.

где вы можете сделать это, просто добавив эти строки кода, как здесь. Двойной или два однократных нажатия?

ПРИМЕЧАНИЕ. ВОЛШЕБНАЯ ЛИНИЯ: [tapRecg requireGestureRecognizerToFail:doubleTapRecg];

АННОТАЦИЯ:

UITapGestureRecognizer *doubleTapRecg = [[UITapGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(doubleTapped:)];
    doubleTapRecg.delegate = self;
    doubleTapRecg.numberOfTapsRequired = 2;
    doubleTapRecg.numberOfTouchesRequired = 1;
    [view addGestureRecognizer:doubleTapRecg];


    UITapGestureRecognizer *tapRecg = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self 
                                       action:@selector(tapped:)];
    tapRecg.delegate = self;
    tapRecg.numberOfTapsRequired = 1;
    tapRecg.numberOfTouchesRequired = 1;
    [view addGestureRecognizer:tapRecg];
    [tapRecg requireGestureRecognizerToFail:doubleTapRecg];


    [doubleTapRecg release];
    [tapRecg release];
4 голосов
/ 15 сентября 2011

Вы можете сделать это с двумя распознавателями жестов и таймером:

UITapGestureRecognizer *tapGestureRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)] autorelease];
[myView addGestureRecognizer:tapGestureRecognizer];

UITapGestureRecognizer *doubleTapGestureRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)] autorelease];
doubleTapGestureRecognizer.numberOfTapsRequired = 2;
[myView addGestureRecognizer:doubleTapGestureRecognizer];

Вам нужно будет использовать небольшую задержку в вашем действии tap:, прежде чем увеличивать немного, потому что за первым касанием можно следоватьс помощью второго нажатия:

- (void)tap:(UITapGestureRecognizer *)recognizer
{
    [self performSelector:@selector(singleTap) withObject:nil afterDelay:0.25];
}

- (void)singleTap
{
    //slightly zoom in...
}

- (void)doubleTap:(UITapGestureRecognizer *)recognizer
{
    //Cancel the timer for the single tap action:
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap) object:nil];
    //zoom in to the max zoom level...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...