在UIKit中,如何检测UISlider何时停止移动但尚未释放

时间:2009-06-05 06:23:33

标签: iphone cocoa-touch audio

我有一个声音效果,我只想在滑块移动时播放。

目前,当UISlider发送Value Changed事件时,我会触发playSound方法。

我需要一种方法来检测滑块何时没有被移动,但尚未被释放。

我想我可以使用它的超级类的控制事件来计算时间,但我不知道如何检测它们。

有什么想法吗?

2 个答案:

答案 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];

}

希望有所帮助,