当用户结束滑块指针的拖动时如何检测事件?
当用户结束滑块指针的拖动时如何检测事件?
Answers:
如果拖动之间不需要任何数据,则只需设置即可:
[mySlider setContinuous: NO];
这样您将收到 valueChanged
仅当用户停止移动滑块时,事件。
Swift 5版本:
mySlider.isContinuous = false
Events [x] Continuous Updates
UISliderView的设置。取消选中此设置continuous
为false / NO。
self.mySlider.isContinuous = false
您可以为UIControlEventValueChanged 添加一个带有两个参数的操作,即发送者和事件:
[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]
然后在处理程序中检查touch对象的阶段:
- (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中添加动作时,您还可以选择将发送者和事件参数都添加到动作中。
isContinuous = true
您的UISlider
。
我使用“内部润饰”和“外部润饰”通知。
界面生成器:
将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");
}
由于UISlider
是的子类UIControl
,因此可以为其设置目标和操作UIControlEventTouchUpInside
。
如果要在代码中执行此操作,则如下所示:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
那会给你一个 dragEndedForSlider:
触摸结束后,消息。
如果要在笔尖中执行此操作,则可以按住Control键并单击并单击滑块以获取其连接菜单,然后将其从“ Touch Up Inside”插槽中拖到目标对象。
您还应该为UIControlEventTouchUpOutside
和添加目标和操作UIControlEventTouchCancel
。
UISlider
自从我撰写此答案以来,的行为已经改变。
UIControlEventTouchCancel
在iOS 9中调用处理程序。但是我只能UIControlEventTouchUpInside
并且UIControlEventTouchUpOutside
只能调用。
为touchUpInside
和touchUpOutside
事件添加目标。您可以以编程方式或从情节提要中进行操作。这是您以编程方式进行的方式
slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
编写函数以处理滑块拖动的结束
func sliderDidEndSliding() {
print("end sliding")
}
您可以使用:
- (void)addTarget:(id)target action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
检测UISlider中何时发生touchDown和touchUp事件
我认为您需要控制事件UIControlEventTouchUpInside
。
斯威夫特3答案
我遇到了同样的问题,最终使它起作用,所以也许它将对某人有所帮助。将your_Slider连接到情节提要中的“值已更改”,并且当滑块移动“ Slider Touched”时动作,而放开“ Slider Released”时。
@IBAction func your_Slider(_ sender: UISlider) {
if (yourSlider.isTracking) {
print("Slider Touched")
} else {
print("Slider Released")
}
}
有时,您可能希望滑块的拖动事件连续触发,但是可以选择执行不同的代码,具体取决于滑块是被拖动还是刚刚被拖动。
为此,我在上面的Andy答案中进行了扩展,该答案利用了Slider的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
}
}
在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)")
}
这样尝试
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);
}
RxSwift:
self.slider.rx.controlEvent([.touchUpInside, .touchUpOutside])
.bind(to: self.viewModel.endSlidingSlider)
.disposed(by: self.disposeBag)