如何在用户结束拖动滑块指针时检测事件?
答案 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)
由于UISlider
是UIControl
的子类,因此您可以为其UIControlEventTouchUpInside
设置目标和操作。
如果你想在代码中这样做,它看起来像这样:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
当触摸结束时,它会向您发送dragEndedForSlider:
消息。
如果要在笔尖中执行此操作,可以按住Ctrl键单击滑块以获取其连接菜单,然后从“Touch Up Inside”套接字拖动到目标对象。
您还应该为UIControlEventTouchUpOutside
和UIControlEventTouchCancel
添加目标和操作。
答案 4 :(得分:12)
为touchUpInside
和touchUpOutside
个事件添加目标。您可以以编程方式或从故事板中执行此操作。这是你以编程方式执行的方式
slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
编写您的函数以处理滑块拖动的结束
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)
答案 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)
有时您会希望滑块的拖动事件连续触发,但可以选择执行不同的代码,具体取决于滑块是否仍在拖动或刚完成拖动。
为了做到这一点,我扩展了Andy上面的回答,它使用了滑块的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
}
}
答案 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)