Как определить событие, когда пользователь закончил перетаскивание указателя ползунка?
IPhone: как определить конец перетаскивания ползунка?
Ответ 1
Если вам не нужны данные между перетаскиванием, вы должны просто установить:
[mySlider setContinuous: NO];
Таким образом вы получите событие valueChanged
только тогда, когда пользователь перестанет перемещать ползунок.
Ответ 2
Вы можете добавить действие, которое принимает два параметра, 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
}
}
}
Обратите внимание, что в Интерфейсном Разработчике при добавлении действия вы также можете добавить к действию параметры отправителя и события.
Ответ 3
Я использую уведомления "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");
}
Ответ 4
Так как UISlider
является подклассом UIControl
, вы можете установить цель и действие для своего UIControlEventTouchUpInside
.
Если вы хотите сделать это в коде, это выглядит так:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
Это сообщение отправит вам сообщение dragEndedForSlider:
при завершении нажатия.
Если вы хотите сделать это в своем наконечнике, вы можете щелкнуть его ползунок, чтобы открыть его меню соединений, а затем перетащить его из сокета "Touch Up Inside" в целевой объект.
Вы также должны добавить цель и действие для UIControlEventTouchUpOutside
и для UIControlEventTouchCancel
.
Ответ 5
Свифт 5 и Свифт 4
-
Добавьте цель для
touchUpInside
иtouchUpOutside
. Вы можете сделать это либо программно, либо из раскадровки. Вот как вы делаете это программноslider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
-
Напишите свою функцию для обработки конца слайдера
func sliderDidEndSliding() { print("end sliding") }
Ответ 6
Вы можете использовать:
- (void)addTarget:(id)target action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
чтобы обнаружить, когда события touchDown и touchUp происходят в UISlider
Ответ 7
Мне кажется, вам нужно контрольное событие UIControlEventTouchUpInside
.
Ответ 8
Подключить Touch Up Inside
и Value Changed
Ответ 9
Свифт 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")
}
}
Ответ 10
Swift 3.1
Иногда вам нужно, чтобы события перетаскивания слайдера запускались непрерывно, но имеют возможность выполнять другой код в зависимости от того, перетаскивается ли ползунок или только что его перетащили.
Чтобы сделать это, я расширил ответ 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
}
}
Ответ 11
В 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)")
}
Ответ 12
У меня была аналогичная проблема в последнее время. Вот что я сделал в 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 делает то, что вы хотите.
Ответ 13
Возможно, вы должны добавить цель для событий UIControlEventTouchUpInside, UIControlEventTouchUpOutside, UIControlEventTouchCancel.
Я встретил ту же проблему раньше, потому что я не добавляю цель для события UIControlEventTouchCancel.
Ответ 14
Попробуйте это
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);
}
Ответ 15
RxSwift:
self.slider.rx.controlEvent([.touchUpInside, .touchUpOutside])
.bind(to: self.viewModel.endSlidingSlider)
.disposed(by: self.disposeBag)