Как заставить UIButton непрерывно стрелять во время нажатия и удержания? - PullRequest
19 голосов
/ 24 мая 2009

Вы знаете, как Марио продолжает двигаться вправо, когда вы нажимаете и удерживаете правую кнопку на D-Pad? Таким же образом я хочу, чтобы мой UIButton непрерывно запускал свое действие в течение всего времени, пока он удерживается. Это возможно для UIButton? Если нет, то возможно ли это сделать с UIImageView, переопределив метод обработки касаний определенным образом? На самом деле, прежде чем пытаться сделать это с помощью UIButton, у меня было несколько UIImageViews (предназначенных для работы в качестве D-Pad), которые были проверены методами обработки касаний, но все стало грязно, поэтому я подумал, что это можно сделать проще с помощью UIButton переключился Кто-нибудь, кто знает, как получить признание непрерывного, неподвижного (не перемещенного) касания, пожалуйста, поделитесь.

Ответы [ 4 ]

41 голосов
/ 15 июня 2009

Вы также можете сделать то же, что показано в предыдущем ответе, и по-прежнему использовать кнопку UIB.

Просто запустите таймер на «Touch Down» и остановите таймер на «Touch Up Inside» или «Touch Up Outside».

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

32 голосов
/ 24 мая 2009

Не используйте кнопку, используйте мультитач и NSTimer:

Создайте локально видимый объект NSTimer внутри вашего интерфейса, затем используйте его для запуска / отмены таймера

-(void)movePlayer:(id)sender {
   <Code to move player>
}

-(void)touchesBegan:(NSSet*)touches  withEvent:(UIEvent*)event {
    timer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(movePlayer:) userInfo:nil repeats:YES];
}

-(void)touchesEnded:(NSSet*)touches  withEvent:(UIEvent*)event {
   if (timer != nil) 
      [timer invalidate];
      timer = nil;
}

-(void)touchesMoved:(NSSet*)touches  withEvent:(UIEvent*)event {
    if (timer != nil) {
       [timer invalidate];
       timer = nil;
    }
}

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

2 голосов
/ 26 ноября 2015

Для меня следующие работы:

  1. Создать кнопку.
  2. Создайте 2 метода (перестаньте касаться и начните касаться) либо в контроллере вида, либо в подклассе.
  3. Добавить 3 Управляющие события. Touch Up Inside и Touch Drag Exit , что оба они идут, чтобы остановить метод касания, и Touch Down идет с методом начала касания.
  4. Когда запускается метод прикосновения, мы должны запустить NSTimer с интервалом примерно 0,2 (это зависит от того, насколько быстро вы хотели бы быть вызванным), повторить true и в качестве селектора метод, который вы хотите вызвать (имеющий материал, который вы хотите выполнить, когда пользователь нажимает кнопку).
  5. Когда метод перестает касаться, мы должны аннулировать таймер (.invalidate()) и назначьте таймер как ноль.

Вот и все!

0 голосов
/ 03 августа 2017

А теперь что-то совершенно другое:
ReactiveCocoa 6 .

self.button.reactive
    .controlEvents([.touchDown])
    .observeValues { button in
        SignalProducer.timer(interval: .milliseconds(500), on: QueueScheduler.main)
            .take(until: button.reactive.controlEvents([.touchDragOutside, .touchDragExit, .touchUpInside, .touchUpOutside, .touchCancel]).map { _ in return })
            .prefix(value: Date())
            .startWithValues { date in
                NSLog("\(date)")
            }
        }
...