2009-06-05 2 views
4

슬라이더가 움직일 때만 재생할 사운드 효과가 있습니다.UIKit에서 UISlider가 이동을 멈췄지만 출시되지 않은 것을 감지하는 방법

현재 UISlider가 값 변경 이벤트를 보낼 때 playSound 메서드가 실행됩니다.

슬라이더를 이동하지 않을 때 감지하는 방법이 필요하지만 아직 해제되지 않았습니다.

컨트롤 이벤트를 사용하여 타이밍을 계산할 수 있다고 생각하지만이를 감지하지 못합니다.

아이디어가 있으십니까?

답변

3

정확하게 이해한다면 슬라이더를 움직이면 움직이는 소리를 계속들을 수 있습니다. 이렇게하려면 UIControlEventTouchDown (및 UIControlEventTouchDragInside) 이벤트와 UIControlEventTouchDragExit/TouchUpOutside/TouchUpInside/TouchCancel (필요한 항목에 따라 다름) 이벤트의 대상으로 한 메서드를 등록하십시오. 첫 번째 방법은 사운드 재생을 시작하고 두 번째 방법은 사운드 재생을 중지합니다. 그런 다음

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

:

당신은 내가 타이머 당신이 터치 다운/ValueCahanged/등 이벤트를받을 때마다 시작하는 것이 좋습니다, 슬라이더가 여전히 감동하지만, 움직이지 않을 때 다른 사운드를 재생하려면 다른 ValueChanged Even를받을 때마다 타이머를 취소하고 다른 타이머를 트리거합니다 (원래 타이머를 다시 설정하는 것이 좋습니다). 타이머가 트리거되면 사용자가 kDelay 이후 슬라이더를 움직이지 않았 음을 나타내며 재생중인 사운드를 변경할 수 있습니다. (TouchUpInside/Outside 이벤트를받을 때 타이머를 취소해야합니다.)

+0

, 나는 소리 중지 할. 이후 사용자가 슬라이더 이동을 다시 시작하면 사운드가 다시 시작되기를 원합니다. 것은 거의 항상 지터의 양이 있습니다. 소리가 없어지면 (사용자에게 뚜렷한) 움직임이없는 경우에도 소리가 끊기면서 더듬 거리는 소리가납니다. – willc2

+0

동일한 기술을 사용할 수 있습니다 : TouchDown 또는 TouchDragInside 이벤트를 받으면 0.5 초 후 (또는 무엇이든) 시작되는 타이머를 시작합니다. 타이머가 작동하면 현재 재생중인 사운드가 중지됩니다. 새로운 드래그 이벤트를받을 때마다 현재 타이머가있는 경우이를 취소하고 새 타이머를 시작하거나 원래 일정을 다시 예약합니다. 물론 중지 된 경우 사운드 재생을 다시 시작합니다. – Felixyz

1

나는 이와 비슷한 일을하고 있으며, UISlider의 고유 한 하위 클래스를 만들었습니다. 필자는 표준 UIResponder 터치 함수를 구현하고 수퍼 클래스를 호출하기 전에 자체 코드를 수행했습니다. 이 접근 방식을 사용하면 터치 위상 정보에 세분화 된 액세스를 제공 할 것이며 슬라이더 개체 내에 타이머를 넣을 수 있습니다 (가장 좋은 방법으로 보입니다).

여기에 약간의 코드가 있습니다. 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]; 

}

희망,

관련 문제