iPhone:如何检测滑块拖动的结束?

时间:2012-02-22 06:46:57

标签: ios iphone ios5 ios4 uislider

如何在用户结束拖动滑块指针时检测事件?

16 个答案:

答案 0 :(得分:144)

如果拖动之间不需要任何数据,则应该只设置:

[mySlider setContinuous: NO];

这样,只有当用户停止移动滑块时,您才会收到valueChanged事件。

答案 1 :(得分:69)

我使用" Touch Up Inside"和"在外面触摸"通知。

界面生成器:

将Interface Builder中的两个通知连接到您的接收方法。该方法可能如下所示:

- (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");
}

答案 2 :(得分:68)

您可以为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
        }
    }
}

注意在Interface Builder中添加操作时,您还可以选择将发件人和事件参数添加到操作中。

答案 3 :(得分:16)

由于UISliderUIControl的子类,因此您可以为其UIControlEventTouchUpInside设置目标和操作。

如果你想在代码中这样做,它看起来像这样:

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

当触摸结束时,它会向您发送dragEndedForSlider:消息。

如果要在笔尖中执行此操作,可以按住Ctrl键单击滑块以获取其连接菜单,然后从“Touch Up Inside”套接字拖动到目标对象。

您还应该为UIControlEventTouchUpOutsideUIControlEventTouchCancel添加目标和操作。

答案 4 :(得分:12)

Swift 4和Swift 3

  1. touchUpInsidetouchUpOutside个事件添加目标。您可以以编程方式或从故事板中执行此操作。这是你以编程方式执行的方式

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
    
  2. 编写您的函数以处理滑块拖动的结束

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

答案 5 :(得分:10)

您可以使用:

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

检测UISlider中发生touchDown和touchUp事件的时间

答案 6 :(得分:7)

我认为您需要控制事件UIControlEventTouchUpInside

答案 7 :(得分:4)

连接Touch Up InsideValue Changed

enter image description here

答案 8 :(得分:4)

斯威夫特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")
    }
}

答案 9 :(得分:4)

在Swift 4中,您可以使用此功能

1 Frist step: - 在滑块中添加目标

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

2第二步: - 创建一个功能

@objc func sliderDidEndSliding(notification: NSNotification)
{
   print("Hello-->\(distanceSlider.value)")
}

答案 10 :(得分:3)

Swift 3.1

有时您会希望滑块的拖动事件连续触发,但可以选择执行不同的代码,具体取决于滑块是否仍在拖动或刚完成拖动。

为了做到这一点,我扩展了Andy上面的回答,它使用了滑块的isTracking属性。我需要记录两种状态:sliderHasFinishedTrackingsliderLastStoredValue

我的代码正确无误:

  • 在开始拖动时不会触发动作

  • 如果用户只需轻按一下滑块即可触发操作(意味着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 :(得分:1)

我最近遇到过类似的问题。这是我在Swift中所做的:

:between

保存此连续值的代码为:

sleep

默认似乎是YES(true)。将它设置为false就可以实现。

答案 12 :(得分:1)

也许你应该为UIControlEventTouchUpInside,UIControlEventTouchUpOutside,UIControlEventTouchCancel事件添加目标。

之前我遇到过同样的问题,因为我没有为 UIControlEventTouchCancel 事件添加目标。

答案 13 :(得分:0)

试试这个

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

答案 14 :(得分:0)

RxSwift:

self.slider.rx.controlEvent([.touchUpInside, .touchUpOutside])
    .bind(to: self.viewModel.endSlidingSlider)
    .disposed(by: self.disposeBag)

答案 15 :(得分:0)

为滑块创建一个动作和出口(或者您可以将动作中的发件人转换为UISlider),然后在UI中取消选中“持续更新”复选框。这样,仅当滑块停止拖动时,我们才能获取滑块值。

@IBAction func actionSlider(_ sender: Any) {
   let value = sliderSpeed.value.rounded()
}

enter image description here