Способ заставить UIButton непрерывно стрелять во время пресс-и-удержания ситуации?


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

4 18

4 ответа:

Не используйте кнопку, используйте мультитач и 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 - если они двигают пальцем, это отменяет таймер, и игрок перестает двигаться.

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

Только таймер начал на "приземлиться" и таймер остановился на "подкрасить внутри" или "подкрасить снаружи".

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

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

  1. Создайте кнопку.
  2. Создайте 2 метода (stop Touch и start Touch) либо в контроллере вида, либо в подклассе.
  3. Добавить 3 Контроль Событий. коснитесь вверх внутри и коснитесь выхода перетаскивания, что оба они идут к методу остановки касания и коснитесь вниз идет с методом запуска касания.
  4. при вызове метода start Touch мы должны запустить NSTimer с интервалом примерно 0.2 (это до вы, как быстро вы хотели бы быть вызваны), повторите true и в качестве селектора метод, который вы хотите вызвать (имея фактический материал, который вы хотите выполнить, когда пользователь нажимает кнопку).
  5. Когда метод stop Touch вызывает, мы должны сделать таймер недействительным (.invalidate()) и присвоить таймеру значение nil.

Вот и все!

А теперь о чем-то совершенно другом.:
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)")
            }
        }