我有一个声音效果,我只想在滑块移动时播放。
目前,当UISlider发送Value Changed事件时,我会触发playSound方法。
我需要一种方法来检测滑块何时没有被移动,但尚未被释放。
我想我可以使用它的超级类的控制事件来计算时间,但我不知道如何检测它们。
有什么想法吗?
答案 0 :(得分:3)
如果我理解正确,只要触摸滑块,无论是否移动,您都希望继续播放声音。为此,请将一个方法注册为UIControlEventTouchDown(可能还有UIControlEventTouchDragInside)事件的目标,将另一个方法注册为UIControlEventTouchDragExit / TouchUpOutside / TouchUpInside / TouchCancel的某些组合(具体取决于您的需要)。第一种方法开始播放声音,第二种方法停止播放。
如果您想在仍然触摸滑块但不移动时播放其他声音,我建议您每次收到TouchDown / ValueCahanged / etc事件时启动计时器:
self.touchTimer = [NSTimer scheduledTimerWithTimeInterval: kDelay
target:self
selector:@selector(noMovement:)
userInfo:nil
repeats:NO];
然后,每当你接收到另一个ValueChanged时,你取消定时器并触发另一个(或者,更好的是,重新安排原始定时器)。当计时器触发时,表示用户自kDelay后没有移动滑块,您可以更改正在播放的声音。 (当你收到TouchUpInside / Outside事件时,你需要取消计时器。)
答案 1 :(得分:1)
我正在做类似的事情,我刚创建了自己的UISlider子类。我在调用超类之前实现了标准的UIResponder触摸函数并执行了我自己的代码。使用这种方法将为您提供对触摸阶段信息的细粒度访问,您可以将计时器放在滑块对象中(似乎是最好的OO方式吗?)
这里有一些代码可以让你将自己的行为添加到touchesBegan。根据您的需要,您还可以覆盖touchesMoved和touchesEnded。只要您调用超类,滑块的行为就不会有任何变化。
在我的情况下,我希望UISlider的灰色轨道可以点击,所以我根据触摸位置手动设置滑块的值。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// set our value, if necessary
CGRect t = [self trackRectForBounds: [self bounds]];
float v = [self minimumValue] + ([[touches anyObject] locationInView: self].x - t.origin.x - 4.0) * (([self maximumValue]-[self minimumValue]) / (t.size.width - 8.0));
[self setValue: v];
[super touchesBegan: touches withEvent: event];
}
希望有所帮助,