Проверьте, закончил ли пользователь скольжение по непрерывному UISlider? - PullRequest
44 голосов
/ 09 января 2012

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

3-я часть включает в себя довольно сложные вычисления, и сейчас кажется невозможным обновить ее в реальном времени при смене слайдера. Это означало бы, что мне пришлось бы установить свойство continuous ползунка на NO, поэтому получать обновления только после того, как ползунок закончил меняться.

Однако я бы предпочел, чтобы обновленное значение отображалось в реальном времени. Есть ли способ иметь ползунок, который будет непрерывным (чтобы я мог обновлять свою метку значения в режиме реального времени) и по-прежнему отправлял какое-то сообщение, когда пользователь закончил взаимодействовать с ним? На данный момент у меня есть интуитивное чувство, чтобы я создал подкласс UISlider и переопределил метод touchesEnded:. Это возможно?

Ответы [ 5 ]

76 голосов
/ 09 января 2012

Вы можете сделать это с помощью простой цели / действий.

Установите цель и действие для события UIControlEventValueChanged, а затем еще одну цель и действие для события UIControlEventTouchUpInside.Если для свойства continuous установлено значение YES, событие изменения значения будет срабатывать при изменении значения ползунка, а событие внутренней обработки будет запускаться только тогда, когда пользователь отпускает элемент управления.

16 голосов
/ 04 июля 2013

Мне просто нужно было это сделать, поэтому я посмотрел сенсорные свойства и использовал полный заголовок IBAction.

Это должно быть жизнеспособной альтернативой для людей, которые хотят получить дополнительный контроль, хотя Jas определенно проще в коде.

- (IBAction)itemSlider:(UISlider *)itemSlider withEvent:(UIEvent*)e;
{
    UITouch * touch = [e.allTouches anyObject];

    if( touch.phase != UITouchPhaseMoved && touch.phase != UITouchPhaseBegan)
    {
       //The user hasn't ended using the slider yet.
    }

}

: D

15 голосов
/ 29 августа 2012

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

6 голосов
/ 17 марта 2017

В Swift 3:

@IBAction func sliderValueChanged(_ slider: UISlider, _ event: UIEvent) {
    guard let touch = event.allTouches?.first, touch.phase != .ended else {
        // ended
        return
    }
    // not ended yet
}
0 голосов
/ 31 мая 2019

Я бы также предложил добавить UIControl.Event.touchCanceled событие, потому что иногда значение ползунка будет меняться и UIControl.Event.touchUpInside и UIControl.Event.touchUpOutside не будут срабатывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...