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

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

Ответы [ 14 ]

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

Свифт 3,1

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

Чтобы сделать это, я расширил ответ Энди, который использует свойство ползунка isTracking. Мне нужно было записать два состояния: sliderHasFinishedTracking и sliderLastStoredValue.

Мой код правильно:

  • не запускает действие при начальном перетаскивании

  • запускает действие, если пользователь только перемещает ползунок одним нажатием (это означает, что 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
  }
}
1 голос
/ 21 декабря 2017

Возможно, вам следует добавить цель для событий UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside IC UIControlEventTouchCancel.

Я встречал ту же проблему раньше, потому что я не добавляю цель для UIControlEventTouchCancel события.

1 голос
/ 20 марта 2016

У меня недавно была похожая проблема.Вот что я сделал в 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 делает то, что вы хотите.

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

Попробуйте вот так

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);
}
...