iPhone: Как определить конец слайдера? - PullRequest
77 голосов
/ 22 февраля 2012

Как обнаружить событие, когда пользователь прекратил перетаскивание указателя ползунка?

Ответы [ 14 ]

145 голосов
/ 22 февраля 2012

Если вам не нужны какие-либо данные между перетаскиванием, вам нужно просто установить:

[mySlider setContinuous: NO];

Таким образом, вы получите событие valueChanged только тогда, когда пользователь перестанет перемещать ползунок.

77 голосов
/ 09 августа 2016

Вы можете добавить действие, которое принимает два параметра, отправителя и событие, для UIControlEventValueChanged:

[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]

Затем проверьте фазу сенсорного объекта в вашем обработчике:

- (void)onSliderValChanged:(UISlider*)slider forEvent:(UIEvent*)event {     
    UITouch *touchEvent = [[event allTouches] anyObject];
    switch (touchEvent.phase) {     
        case UITouchPhaseBegan:
            // handle drag began
            break;
        case UITouchPhaseMoved:
            // handle drag moved
            break;
        case UITouchPhaseEnded:
            // handle drag ended
            break;
        default:
            break;
    }
}

Swift 4 & 5

slider.addTarget(self, action: #selector(onSliderValChanged(slider:event:)), for: .valueChanged)
@objc func onSliderValChanged(slider: UISlider, event: UIEvent) {
    if let touchEvent = event.allTouches?.first {
        switch touchEvent.phase {
        case .began:
            // handle drag began
        case .moved:
            // handle drag moved
        case .ended:
            // handle drag ended
        default:
            break
        }
    }
}

Обратите внимание, что в Интерфейсном Разработчике при добавлении действия вы также можете добавить к действию параметры отправителя и события.

69 голосов
/ 03 марта 2012

Я использую уведомления «Touch Up Inside» и «Touch up outside».

Интерфейсный Разработчик:

Соедините оба уведомления в Интерфейсном Разработчике с вашим методом получения.Метод может выглядеть следующим образом:

- (IBAction)lengthSliderDidEndSliding:(id)sender {
    NSLog(@"Slider did end sliding... Do your stuff here");
}

В коде:

Если вы хотите подключить его программным способом, у вас будет что-то подобное в вашем viewWillAppear (или где угодноэто вам подходит) вызов:

[_mySlider addTarget:self
              action:@selector(sliderDidEndSliding:) 
    forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];

Метод получения будет выглядеть так:

- (void)sliderDidEndSliding:(NSNotification *)notification {
     NSLog(@"Slider did end sliding... Do your stuff here");
}
16 голосов
/ 22 февраля 2012

Поскольку UISlider является подклассом UIControl, вы можете установить цель и действие для его UIControlEventTouchUpInside.

Если вы хотите сделать это в коде, это выглядит так:

[self.slider addTarget:self action:@selector(dragEndedForSlider:)
    forControlEvents:UIControlEventTouchUpInside];

Это отправит вам сообщение dragEndedForSlider:, когда касание закончится.

Если вы хотите сделать это в своем кончике, вы можете щелкнуть по ползунку, чтобы открыть меню подключений, и перетащить его из гнезда «Touch Up Inside» к целевому объекту.

Вы также должны добавить цель и действие для UIControlEventTouchUpOutside и для UIControlEventTouchCancel.

13 голосов
/ 10 мая 2017

Свифт 5 и Свифт 4

  1. Добавить цель для touchUpInside и touchUpOutside событий. Вы можете сделать это либо программно, либо из раскадровки. Вот как вы делаете это программно

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
    
  2. Напишите свою функцию для обработки конца слайдера

    func sliderDidEndSliding() {
        print("end sliding")
    }
    
10 голосов
/ 22 февраля 2012

Вы можете использовать:

- (void)addTarget:(id)target action:(SEL)action 
                   forControlEvents:(UIControlEvents)controlEvents  

, чтобы определить, когда происходят события touchDown и touchUp в UISlider

7 голосов
/ 22 февраля 2012

Я думаю, вам нужно контрольное событие UIControlEventTouchUpInside.

4 голосов
/ 22 декабря 2017

В Swift 4 вы можете использовать эту функцию

1 Шаг Frist: - Добавление цели в слайдер

self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))

2 Второй шаг: - Создать функцию

@objc func sliderDidEndSliding(notification: NSNotification)
{
   print("Hello-->\(distanceSlider.value)")
}
4 голосов
/ 13 марта 2017

Свифт 3 ответа

У меня была та же проблема, и в конце концов она сработала, так что, возможно, это кому-нибудь поможет. Подключите your_Slider к значению «Изменено» в раскадровке, и когда ползунок перемещен, действует «Слайдер коснулся», а когда отпустите «Слайдер отпущен».

@IBAction func your_Slider(_ sender: UISlider) {
    if (yourSlider.isTracking) {
        print("Slider Touched")
    } else {
        print("Slider Released")
    }
}
4 голосов
/ 11 сентября 2016

Соединение Touch Up Inside и Value Changed

enter image description here

...