Вы знаете, как Марио просто продолжает работать вправо, когда вы нажимаете и удерживаете правую кнопку на D-Pad? Таким же образом я хочу, чтобы мой UIButton постоянно запускал его действие в течение продолжительности его удерживания. Возможно ли это для UIButton? Если нет, возможно ли это сделать с UIImageView путем переопределения метода обработки касаний определенным образом? На самом деле, прежде чем пытаться это сделать с UIButton, у меня были некоторые UIImageViews (Arranged to D-Pad), которые были проверены методами сенсорной обработки, но все стало запутаться, поэтому я подумал, что с UIButton это можно сделать проще и, следовательно, переключение. Любой, кто знает, как получить признание непрерывного, неподвижного (не перемещенного) нажатия, пожалуйста, поделитесь.
Способ постоянно активировать UIButton во время ситуации с нажатием и удержанием?
Ответ 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)")
}
}