Подтвердить что ты не робот

Можно ли различать длительное нажатие и нажатие на кнопку?

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

  • Нажмите на UIButton
  • Отключение и удержание на UIButton

?

4b9b3361

Ответ 1

Да, это довольно легко реализовать с помощью 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.

Ответ 2

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

Вы подклассифицируете UIButton, вы переопределяете методы touchhesBegan и 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/

Ответ 3

Лучшим решением, о котором я могу думать, является создание другого класса и подкласса 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

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

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

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

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