在压制和保持情况下使UIButton持续点火的方法?

时间:2009-05-24 04:58:04

标签: iphone cocoa-touch uibutton multi-touch

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

4 个答案:

答案 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)

对我来说,以下工作:

  1. 创建一个按钮。
  2. 在视图控制器或子类中创建2个方法(停止触摸并开始触摸)。
  3. 添加 3 控件事件。 触摸内部触摸拖动退出,两者都停止触摸方法,触摸进入开始触摸方法。
  4. 当开始触摸方法调用时,我们应该启动一个间隔大约为0.2的NSTimer(由你决定调用的速度取决于你),重复true,并选择一个你想要调用的方法(具有实际值)当用户点击按钮时你想要执行的东西。)
  5. 当停止触摸方法调用时,我们应该使计时器无效 (.invalidate())并将计时器指定为nil。
  6. 这就是全部!

答案 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)")
            }
        }