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

StackOverflow https://stackoverflow.com/questions/903114

Вопрос

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

Это было полезно?

Решение

Не используйте кнопку, используйте мультитач и 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 метода (прекратите касаться и начните касаться) либо в контроллере представления, либо в подклассе.
  3. Добавлять 3 Контролируйте события. Подкраска внутри и Коснитесь и перетащите Выход что они оба перестанут прикасаться к методу и Тач Даун идет с методом начала прикосновения.
  4. Когда вызывается метод start touch, мы должны запустить NSTimer с интервалом примерно 0,2 (от вас зависит, насколько быстро вы хотите, чтобы его вызывали), повторить true и в качестве селектора метод, который вы хотите вызвать (имея фактические данные, которые вы хотите выполняться, когда пользователь нажимает кнопку).
  5. Когда метод перестать прикоснуться к методу, мы должны аннулировать таймер (.invalidate()) и назначьте таймер равным нулю.

Вот и все!

А сейчас нечто соверешнно другое:
РеактивныйКакао 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)")
            }
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top