Iphone 在按住的情况下,如何使UIButton持续开火?

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可以更轻松地完成此操作,并因此切换。任何知道如何识别连续、静止(未移

你知道当你按住D-Pad上的右键时,Mario是如何一直向右跑的吗?以同样的方式,我希望我的UIButton在按住的时间内持续启动它的操作。这是否可能用于UIButton?如果不是,是否可以通过以某种方式覆盖触摸处理方法来处理UIImageView?事实上,在尝试使用UIButton完成此操作之前,我有一些UIImageView(安排为用作D-Pad),通过触摸处理方法进行检查,但事情开始变得混乱,因此我认为使用UIButton可以更轻松地完成此操作,并因此切换。任何知道如何识别连续、静止(未移动)下触的人,请分享。

不要使用按钮,请使用多点触摸和N定时器:

在界面内创建一个视图本地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;
    }
}
-(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,因为它们提供了一些内置的视觉增强功能,您不必自己编写代码。

对我来说,以下功能非常有用:

  • 创建一个按钮
  • 在视图控制器或子类中创建2个方法(停止触摸和开始触摸)
  • 添加3个控制事件内部触碰触碰拖动退出这两种方法都使用停止触碰方法,而触碰向下使用开始触碰方法
  • 当开始触摸方法调用时,我们应该以大约0.2的间隔启动一个NSTimer(取决于您希望被调用的速度),重复true,并作为选择器调用一个您希望被调用的方法(具有用户点击按钮时要执行的实际内容)
  • 当停止触摸方法调用时,我们应该使计时器无效 (
    .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。总之,我们使用的是: