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

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

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

4b9b3361

Ответ 1

Не используйте кнопку, используйте multi-touch и 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;
    }
}

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

Ответ 2

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

Просто включите таймер в "Touch Down" и остановите таймер на "Touch Up Inside" или "Touch Up Outside".

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

Ответ 3

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

  • Создайте кнопку.
  • Создайте 2 метода (перестаньте касаться и начните касаться) либо в контроллере вида, либо в подклассе.
  • Добавить 3 Контрольные события. Нажмите "Внутри" и Touch Drag Exit, чтобы они оба перестали касаться метода, а Touch Down - с помощью метода касания начала.
  • Когда вы начинаете касаться вызова метода, мы должны запустить NSTimer с интервалом приблизительно 0.2 (вам зависит от того, как быстро вы хотите быть вызванным), repeat true и как селектор - метод, который вы хотите вызвать (с фактическим которые вы хотите выполнить, когда пользователь нажимает кнопку).
  • При вызове метода stop touching мы должны аннулировать таймер (.invalidate()) и назначьте таймер как ноль.

Что все!

Ответ 4

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