19

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

4

4 回答 4

42

您也可以执行与上一个答案中显示的类似的操作,并且仍然使用 UIButton。

只需在“Touch Down”上启动计时器,然后在“Touch Up Inside”或“Touch Up Outside”上停止计时器。

就个人而言,我喜欢使用 UIButtons,因为它们提供了一些内置的视觉增强功能,您不必自己编写代码。

于 2009-06-15T18:01:25.910 回答
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 触发器 - 如果他们移动手指,这将取消计时器,并且玩家停止移动。

于 2009-05-24T05:08:16.430 回答
2

对我来说,以下作品:

  1. 创建一个按钮。
  2. 在视图控制器或子类中创建 2 个方法(停止触摸并开始触摸)。
  3. 添加3 个控制事件。Touch Up InsideTouch Drag Exit两者都采用停止触摸方法,Touch Down采用开始触摸方法。
  4. 当开始触摸方法调用时,我们应该以大约 0.2 的间隔启动一个 NSTimer(取决于您希望被调用的速度),重复 true 并作为选择器作为您想要调用的方法(拥有您想要的实际内容当用户点击按钮时执行)。
  5. 当停止触摸方法调用时,我们应该使计时器(.invalidate())无效并将计时器分配为零。

就这样!

于 2015-11-26T08:35:19.113 回答
1

现在来点完全不同的东西:
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)")
            }
        }
于 2017-08-02T23:47:13.640 回答