在按住状态期间让UIButton不断燃烧的方法?
问题描述:
当您按住D-Pad上的右键时,您知道Mario是如何继续向右跑的吗?以同样的方式,我希望我的UIButton在持续时间内持续开启它的行动。这是可能的UIButton?如果没有,是否可以通过以某种方式重写触摸处理方法来处理UIImageView?其实,在试图用UIButton完成这个工作之前,我有一些UIImageViews(安排用作D-Pad),它们通过触摸处理方法进行检查,但事情开始变得混乱,所以我认为这可以通过UIButton更容易完成,因此切换。任何人都知道如何得到持续的,静止的(未移动的)触觉的认可,请分享。在按住状态期间让UIButton不断燃烧的方法?
答
不要使用按钮,使用多点触控的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触发器 - 如果他们移动手指,则取消计时器,并且播放器停止移动。
答
你也可以做与上一个答案中显示的类似的东西,但仍然使用UIButton。
只需在“Touch Down”上启动计时器,并让计时器在“Touch Up Inside”或“Touch Up Outside”中停止。
个人而言,我喜欢使用UIButtons,因为它们提供了一些内置的视觉增强功能,您不必自行编写代码。
答
对我来说,以下工作:
- 创建一个按钮。
- 在视图控制器或子类中创建2种方法(停止触摸并开始触摸)。
- 加控制事件。 TouchUp Inside and Touch Drag Exit他们两人都停止触摸方法和Touch Down随着开始触摸方式。
- 当开始触摸方法调用时,我们应该启动一个间隔大约为0.2的NSTimer(这取决于您调用的速度有多快),重复true并作为一个选择器调用一个您想要调用的方法当用户点击按钮时要执行的内容)。
- 当停止触摸方法调用时,我们应该使定时器 (
.invalidate()
)无效,并将定时器赋值为nil。
就这样!
答
而现在对于完全不同的东西:
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)")
}
}
你有2 touchesBegan,我相信第2应该touchesMoved。 – freespace 2009-05-24 05:21:28
伟大的,但你能纠正重复touchesBegan触发到你打算触摸移动,所以没有人会感到困惑。 – RexOnRoids 2009-05-24 05:38:02