Вы знаете, как Марио просто продолжает бежать вправо, когда вы нажимаете и удерживаете правую кнопку на крестовине? Точно так же я хочу, чтобы мой UIButton непрерывно запускал свое действие в течение всего времени, пока он удерживается нажатым. Возможно ли это для UIButton? Если нет, возможно ли это сделать с помощью UIImageView, переопределив метод обработки касания определенным образом? На самом деле, прежде чем пытаться сделать это с помощью UIButton, у меня было несколько UIImageViews (устроенных для работы в качестве D-Pad), которые были проверены методами обработки касания, но все начало запутываться, поэтому я подумал, что это можно было бы сделать проще с UIButton и, следовательно, переключился. Кто-нибудь, кто знает, как получить распознавание непрерывного, неподвижного (не сдвинутого) касания вниз, поделитесь, пожалуйста.
Способ заставить UIButton непрерывно срабатывать во время нажатия и удержания?
Ответы (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.
Просто запустите таймер на «Touch Down» и остановите его на «Touch Up Inside» или «Touch Up Outside».
Лично мне нравится использовать UIButtons, потому что они предлагают некоторые встроенные визуальные улучшения, которые вам не нужно кодировать самостоятельно.
Для меня работает следующее:
- Создайте кнопку.
- Создайте 2 метода (перестаньте касаться и начните касаться) либо в контроллере представления, либо в подклассе.
- Добавьте 3 события управления. Touch Up Inside и Touch Drag Exit, оба из которых переходят к методу прекращения касания, а Touch Down — к методу начала касания.
- Когда вы начинаете касаться вызова метода, мы должны запустить NSTimer с интервалом примерно 0,2 (это зависит от вас, как быстро вы хотите, чтобы его вызывали), повторить true и в качестве селектора метод, который вы хотите вызвать (имея фактические вещи, которые вы хотите выполняться, когда пользователь нажимает кнопку).
- Когда вызывается метод остановки касания, мы должны аннулировать таймер (
.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)")
}
}