В UIKit, как определить, когда UISlider перестал двигаться, но не был выпущен - PullRequest
4 голосов
/ 05 июня 2009

У меня есть звуковой эффект, который я хочу воспроизвести, только когда движется ползунок.

В настоящее время у меня срабатывает метод playSound, когда UISlider отправляет события Value Changed.

Мне нужен способ определить, когда ползунок не двигается, но еще не отпущен.

Я думаю, что могу использовать управляющие события этого суперкласса для определения времени, но я не вижу, как их обнаружить.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 05 июня 2009

Если я вас правильно понимаю, вы хотите продолжать воспроизводить звук до тех пор, пока ползунок не будет затронут, независимо от того, движется он или нет. Для этого зарегистрируйте один метод в качестве цели для событий 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 голос
/ 22 июня 2009

Я делаю что-то похожее на это, и я только что создал свой собственный подкласс UISlider. Я реализовал стандартные функции касания UIResponder и выполнил свой собственный код перед вызовом суперкласса. Использование этого подхода предоставит вам точный доступ к информации о фазе касания, и вы можете поместить таймер в объект слайдера (кажется, лучший способ сделать это из ОО?)

Вот немного кода, который позволит вам добавить ваше собственное поведение к touchesBegan. В зависимости от ваших потребностей, вы также можете переопределить прикосновения Moved и 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];

}

Надеюсь, это поможет,

...