2009-06-05 45 views
4

我有一個音效,我只想在滑塊移動時播放。在UIKit中,如何檢測UISlider何時停止移動但尚未發佈

當UISlider發送Value Changed事件時,我有playSound方法。

我需要一種方式來檢測何時滑塊沒有被移動,但尚未被釋放。

我想我可以使用它的超類的控制事件來計算時間,但我沒有看到如何檢測它們。

任何想法?

回答

3

如果我理解正確,只要觸摸滑塊,無論是否在移動,都要繼續播放聲音。爲此,請將一種方法註冊爲UIControlEventTouchDown(也許是UIControlEventTouchDragInside)事件的目標,另一種方法是針對UIControlEventTouchDragExit/TouchUpOutside/TouchUpInside/TouchCancel(取決於您需要的)的某種組合。第一種方法開始播放聲音,第二種方法停止播放聲音。

如果你想玩另一個聲音時,滑塊仍感動,但不動,我會建議您每次收到一個達陣/ ValueCahanged /等事件時,啓動定時器:

self.touchTimer = [NSTimer scheduledTimerWithTimeInterval: kDelay 
               target:self 
               selector:@selector(noMovement:) 
               userInfo:nil 
               repeats:NO]; 

然後,每當你接收到另一個ValueChanged時,你就取消定時器並觸發另一個(或者更好的是重新安排原始時間)。當計時器觸發時,這意味着用戶自kDelay以來沒有移動滑塊,並且您可以更改正在播放的聲音。 (當你得到一個TouchUpInside/Outside事件時,你需要取消定時器。)

+0

正如我在問題中提到,如果滑塊仍在下跌,但不動,我想要的聲音停止。如果用戶此後繼續移動滑塊,我希望聲音再次啓動。事情是,幾乎總是有少量的抖動。即使沒有(對用戶明顯的)運動,當聲音被切斷時,這導致口吃。 – willc2 2009-06-06 06:37:02

+0

你可以使用相同的技巧:當你收到一個TouchDown或TouchDragInside事件時,你啓動一個定時器,在0.5秒(或其他)後觸發。當定時器啓動時,它會停止當前正在播放的聲音。每當您收到新的拖動事件時,您都會取消當前的計時器並開始一個新的計時器(或重新計劃原始計時器),當然,如果它已停止,則繼續播放聲音。 – Felixyz 2009-06-06 13:50:28

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

}

希望幫助,