当你按住D-Pad上的右键时,你知道马里奥是如何继续向右跑的吗?以同样的方式,我希望我的UIButton在按下它的持续时间内不断发动它的动作。这可能是UIButton吗?如果没有,是否可以通过以某种方式覆盖触摸处理方法来处理UIImageView?实际上,在尝试使用UIButton完成之前我有一些UIImageViews(安排作为D-Pad),通过触摸处理方法检查但事情开始变得混乱所以我认为这可以通过UIButton更容易完成切换。任何知道如何识别连续,静止(未移动)向下触摸的人,请分享。
答案 0 :(得分:41)
您也可以执行与上一个答案中显示的内容类似的操作,并仍然使用UIButton。
只需在“Touch Down”上启动计时器,并将计时器停在“Touch Up Inside”或“Touch Up Outside”上。
就个人而言,我喜欢使用UIButton,因为它们提供了一些内置的视觉增强功能,您无需自己编写代码。
答案 1 :(得分:32)
请勿使用按钮,请使用多点触控和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触发器 - 如果他们移动手指,这将取消计时器,并且播放器停止移动。
答案 2 :(得分:2)
对我来说,以下工作:
.invalidate()
)并将计时器指定为nil。这就是全部!
答案 3 :(得分:0)
现在完全不同的东西:
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)")
}
}