Ответ 1
Если вам не нужны данные между перетаскиванием, вы должны просто установить:
[mySlider setContinuous: NO];
Таким образом вы получите событие valueChanged
только тогда, когда пользователь перестанет перемещать ползунок.
Как определить событие, когда пользователь закончил перетаскивание указателя ползунка?
Если вам не нужны данные между перетаскиванием, вы должны просто установить:
[mySlider setContinuous: NO];
Таким образом вы получите событие valueChanged
только тогда, когда пользователь перестанет перемещать ползунок.
Вы можете добавить действие, которое принимает два параметра, sender и событие, для 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;
}
}
Свифт 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
}
}
}
Обратите внимание, что в Интерфейсном Разработчике при добавлении действия вы также можете добавить к действию параметры отправителя и события.
Я использую уведомления "Touch Up Inside" и "Touch out outside".
Конструктор интерфейсов:
Подключите оба уведомления в построителе интерфейса к вашему методу получения. Метод может выглядеть следующим образом:
- (IBAction)lengthSliderDidEndSliding:(id)sender {
NSLog(@"Slider did end sliding... Do your stuff here");
}
В коде:
Если вы хотите запрограммировать его программно, у вас будет что-то подобное в вашем представленииWillAppear (или везде, где оно вам подходит):
[_mySlider addTarget:self
action:@selector(sliderDidEndSliding:)
forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
Метод приема будет выглядеть так:
- (void)sliderDidEndSliding:(NSNotification *)notification {
NSLog(@"Slider did end sliding... Do your stuff here");
}
Так как UISlider
является подклассом UIControl
, вы можете установить цель и действие для своего UIControlEventTouchUpInside
.
Если вы хотите сделать это в коде, это выглядит так:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
Это сообщение отправит вам сообщение dragEndedForSlider:
при завершении нажатия.
Если вы хотите сделать это в своем наконечнике, вы можете щелкнуть его ползунок, чтобы открыть его меню соединений, а затем перетащить его из сокета "Touch Up Inside" в целевой объект.
Вы также должны добавить цель и действие для UIControlEventTouchUpOutside
и для UIControlEventTouchCancel
.
Добавьте цель для touchUpInside
и touchUpOutside
. Вы можете сделать это либо программно, либо из раскадровки. Вот как вы делаете это программно
slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
Напишите свою функцию для обработки конца слайдера
func sliderDidEndSliding() {
print("end sliding")
}
Вы можете использовать:
- (void)addTarget:(id)target action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
чтобы обнаружить, когда события touchDown и touchUp происходят в UISlider
Мне кажется, вам нужно контрольное событие UIControlEventTouchUpInside
.
Подключить Touch Up Inside
и Value Changed
Свифт 3 ответ
У меня была одна и та же проблема, и в итоге мне это удалось, так что, возможно, это поможет кому-то. Подключите your_Slider к "Value Changed" в раскадровке, и когда слайдер перемещается, "Slider Touched" срабатывает, и если отпустить "Slider Released".
@IBAction func your_Slider(_ sender: UISlider) {
if (yourSlider.isTracking) {
print("Slider Touched")
} else {
print("Slider Released")
}
}
Иногда вам нужно, чтобы события перетаскивания слайдера запускались непрерывно, но имеют возможность выполнять другой код в зависимости от того, перетаскивается ли ползунок или только что его перетащили.
Чтобы сделать это, я расширил ответ Andy выше, что использует свойство sla isTracking
. Мне нужно было записать два состояния: sliderHasFinishedTracking
и sliderLastStoredValue
.
Мой код правильно:
не запускает действие при запуске drag
запускает действие, если пользователь только подталкивает слайдер одним нажатием (это означает, что isTracking
остается false
)
class SliderExample: UIViewController {
var slider: UISlider = UISlider()
var sliderHasFinishedTracking: Bool = true
var sliderLastStoredValue: Float!
override func loadView() {
super.loadView()
slider.minimumValue = 100.0
slider.maximumValue = 200.0
slider.isContinuous = true
slider.value = 100.0
self.sliderLastStoredValue = slider.value
slider.addTarget(self, action: #selector(respondToSlideEvents), for: .valueChanged)
// add your slider to the view however you like
}
func respondToSlideEvents(sender: UISlider) {
let currentValue: Float = Float(sender.value)
print("Event fired. Current value for slider: \(currentValue)%.")
if(slider.isTracking) {
self.sliderHasFinishedTracking = false
print("Action while the slider is being dragged ⏳")
} else {
if(self.sliderHasFinishedTracking && currentValue == self.sliderLastStoredValue){
print("Slider has finished tracking and its value hasn't changed, " +
"yet event was fired anyway. 🤷") // No need to take action.
} else {
self.sliderHasFinishedTracking = true
print("Action upon slider drag/tap finishing ⌛️")
}
}
self.sliderLastStoredValue = currentValue
}
}
В Swift 4 вы можете использовать эту функцию
1 Шаг фриста: - Добавление цели в слайдер
self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))
2 Второй шаг: - Создать функцию
@objc func sliderDidEndSliding(notification: NSNotification)
{
print("Hello-->\(distanceSlider.value)")
}
У меня была аналогичная проблема в последнее время. Вот что я сделал в Swift:
theSlider.continuous = false;
Код, который содержит это непрерывное значение, читает:
public var continuous: Bool // if set, value change events are generated
// any time the value changes due to dragging. default = YES
По умолчанию используется значение YES (true). Установка его в значение false делает то, что вы хотите.
Возможно, вы должны добавить цель для событий UIControlEventTouchUpInside, UIControlEventTouchUpOutside, UIControlEventTouchCancel.
Я встретил ту же проблему раньше, потому что я не добавляю цель для события UIControlEventTouchCancel.
Попробуйте это
customSlider.minimumValue = 0.0;
customSlider.maximumValue = 10.0;
[customSlider addTarget:self action:@selector(changeSlider:) forControlEvents:UIControlEventValueChanged];
-(void)changeSlider:(id)sender{
UISlider *slider=(UISlider *)sender;
float sliderValue=(float)(slider.value );
NSLog(@"sliderValue = %f",sliderValue);
}
RxSwift:
self.slider.rx.controlEvent([.touchUpInside, .touchUpOutside])
.bind(to: self.viewModel.endSlidingSlider)
.disposed(by: self.disposeBag)