Подтвердить что ты не робот

IPhone: как определить конец перетаскивания ползунка?

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

4b9b3361

Ответ 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

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

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

    func sliderDidEndSliding() {
        print("end sliding")
    }
    

Ответ 6

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

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

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

Ответ 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)