Можно ли провести различие между долгим нажатием и нажатием на кнопку? - PullRequest
12 голосов
/ 16 декабря 2010

Можем ли мы вызывать различные действия / делегаты в ответ на два разных события

  1. Нажатие на кнопку UIB
  2. Нажмите и удерживайте кнопку UIB

Ответы [ 3 ]

16 голосов
/ 17 декабря 2010

Да, это довольно просто реализовать с помощью UILongPressGestureRecognizer (на iPhone OS 3.2+). Длительное нажатие будет обрабатываться распознавателем жестов, а короткое нажатие - до обычного действия кнопки.

Например, я разделил UIButton на подклассы и добавил следующий метод для задания действия длинного прикосновения для выполнения касания (longPressGestureRecognizer является переменной экземпляра):

- (void)setLongTouchAction:(SEL)newValue
{
    if (newValue == NULL)
    {
        [self removeGestureRecognizer:longPressGestureRecognizer];
        [longPressGestureRecognizer release];
        longPressGestureRecognizer = nil;
    }
    else
    {
        [longPressGestureRecognizer release];
        longPressGestureRecognizer = nil;

        longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:[[self allTargets] anyObject] action:newValue];
        [self addGestureRecognizer:longPressGestureRecognizer];
    }
}

Затем я мог бы сделать следующее, чтобы установить действия короткого и длинного нажатия, которые будут обрабатываться одной и той же целью:

[undoButton addTarget:self action:@selector(performUndo:) forControlEvents:UIControlEventTouchUpInside];
[undoButton setLongTouchAction:@selector(showUndoOptions:)];

Как видите, это полезно для кнопок отмены, которые вы видите в заголовках многих приложений iPad.

8 голосов
/ 17 декабря 2010

Ответ Брэда Ларсона выглядит довольно неплохо, но вот еще один, который может дать вам немного больше гибкости / контроля над тем, что вы хотите или возможно захотите сделать.

Вы подкласс UIButton, вы переопределяете методы touchesBegan и touchesEndedчтобы, когда пользователь запускает касание, вы вызываете

[self performSelector:@selector(detecetedLongTap) withObject:nil afterDelay:1.0];

, а в штрихе прикосновения вы звоните:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(detecetedLongTap) object:nil];

, чтобы отменить событие, если палец был поднят слишком рано.

Вы можете получить полный код этого сообщения в этом блоге:

http://www.isignmeout.com/adding-long-tap-functionality-uibutton/

4 голосов
/ 16 декабря 2010

Лучшее решение, которое я могу придумать, это создать другой класс и подкласс UIButton.Затем в Интерфейсном Разработчике (если это то, что вы используете), вы можете установить класс кнопки для пользовательского класса, который вы только что создали.

Так что в этом новом классе вы должны переопределить метод с именем

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

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

NSSet *myTouches = [event touchesForView:self.view];

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

NSUInteger numTaps = [[myTouches anyObject] tapCount];

Если это число равно 2, это означает, что пользователь просто дважды нажал вашу кнопку.Теперь наступает следующая часть.Как вы знаете, если пользователь удерживает эту кнопку?Хорошо, когда пользователь отпускает экран, вызывается другой метод.Вам также нужно переопределить этот:

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

Здесь вы узнаете, перестал ли человек касаться экрана или его палец все еще на нем.Если его палец все еще на нем, то это событие еще не было вызвано.

Теперь достаточно с фоном

Вот мое предложение для вас.Я предлагаю вам переопределить метод touchesBegan: и проверить, равно ли количество нажатий в кнопке 2. Если это так, то запустите таймер, который делает то, что вам нужно, до тех пор, пока вам это нужно, и затемв методе touchesEnded: вы продолжите и остановите этот таймер, и таким образом вы будете делать все, что вам нужно, столько, сколько вам нужно, ИЛИ, пока пользователь удерживаетна кнопку.

Надеюсь, это поможет, очевидно, я написал не весь код для вас, вам придется экспериментировать и исследовать этот материал, но если у вас возникнут вопросы, я буду радпротянуть руку помощи:)

...