Iphone 在按住的情况下,如何使UIButton持续开火?
你知道当你按住D-Pad上的右键时,Mario是如何一直向右跑的吗?以同样的方式,我希望我的UIButton在按住的时间内持续启动它的操作。这是否可能用于UIButton?如果不是,是否可以通过以某种方式覆盖触摸处理方法来处理UIImageView?事实上,在尝试使用UIButton完成此操作之前,我有一些UIImageView(安排为用作D-Pad),通过触摸处理方法进行检查,但事情开始变得混乱,因此我认为使用UIButton可以更轻松地完成此操作,并因此切换。任何知道如何识别连续、静止(未移动)下触的人,请分享。不要使用按钮,请使用多点触摸和N定时器: 在界面内创建一个视图本地NSTimer对象,然后使用它启动/取消计时器Iphone 在按住的情况下,如何使UIButton持续开火?,iphone,cocoa-touch,uibutton,multi-touch,Iphone,Cocoa Touch,Uibutton,Multi Touch,你知道当你按住D-Pad上的右键时,Mario是如何一直向右跑的吗?以同样的方式,我希望我的UIButton在按住的时间内持续启动它的操作。这是否可能用于UIButton?如果不是,是否可以通过以某种方式覆盖触摸处理方法来处理UIImageView?事实上,在尝试使用UIButton完成此操作之前,我有一些UIImageView(安排为用作D-Pad),通过触摸处理方法进行检查,但事情开始变得混乱,因此我认为使用UIButton可以更轻松地完成此操作,并因此切换。任何知道如何识别连续、静止(未移
-(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;
}
}
-(void)movePlayer:(id)发送者{
<移动播放器的代码>
}
-(无效)触摸开始:(NSSet*)触摸事件:(UIEvent*)事件{
计时器=[NSTimer scheduledTimerWithTimeInterval:0.3目标:自选择器:@selector(movePlayer:)userInfo:nil repeats:YES];
}
-(void)touchesend:(NSSet*)toucheevent:(UIEvent*)event{
如果(计时器!=nil)
[计时器失效];
定时器=零;
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件{
如果(计时器!=nil){
[计时器失效];
定时器=零;
}
}
通过这种方式,您可以在预定义的时间间隔内重复事件,而不必依赖于按钮,从而获得所需的重复行为。
注意触摸移动的触发器-如果他们移动手指,这将取消计时器,玩家将停止移动。您也可以执行与上一答案中所示类似的操作,并且仍然使用UIButton 只需在“触地”时启动计时器,并在“触地内”或“触地外”时停止计时器
就我个人而言,我喜欢使用UIButton,因为它们提供了一些内置的视觉增强功能,您不必自己编写代码。对我来说,以下功能非常有用:
.invalidate()
)并将计时器指定为nil就这些 现在来看看完全不同的东西:
反应可可6
self.button.reactive
.controlEvents([.触地])
.observeValues{中的按钮
SignalProducer.timer(间隔:。毫秒(500),在:QueueScheduler.main上)
.take(直到:button.reactive.controlEvents([.touchDragOutside、.touchDragExit、.touchUpInside、.touchUpOutside、.touchCancel]).map{in return})
.prefix(值:Date())
.startWithValues{date in
NSLog(“\(日期)”)
}
}
您有2次触摸开始,我认为第2次触摸应该被移动。很好,但是您是否可以将重复的触摸开始触发器更正为您预期的触摸移动,这样就不会有人感到困惑了。请澄清,“内部触摸”和“外部触摸”事件都应该配置为停止计时器。在我看来,比所选答案更好的答案。可以通过界面生成器进行配置。此外,使用iActions通常会导致比ToucheSBegind和frieds更干净、更易于理解的代码。如果采用这种方法,请不要忘记处理UIControlEventTouchCancel。(尽管我明确推荐封装NSTimer的UIButton子类。视图控制器往往太大,因此您可以做任何事情将代码移出视图控制器都是一件好事。)如果用户握住按钮并将手指拖到按钮区域之外,UIControlEventTouchCancel对我不起作用。与其使用TouchCancel事件,不如使用(在我看来)TouchDragExit。总之,我们使用的是: