iPhone:如何检测滑块拖动结束?
当用户结束拖动滑块指针时如何检测事件?
如果你不需要拖拽任何数据,你应该简单地设置:
[mySlider setContinuous: NO];
这样,只有当用户停止移动滑块时,才会收到valueChanged
事件。
我使用“Touch Up Inside”和“Touch up outside”通知。
界面生成器:
将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"); }
您可以为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
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 } } }
请注意,在添加动作时,在界面生成器中,您还可以select将发件人参数和事件参数添加到动作中。
您可以使用:
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
来检测UISlider中touchDown和touchUp事件的发生时间
由于UISlider
是UIControl
的子类,因此可以为其UIControlEventTouchUpInside
设置目标和操作。
如果你想在代码中做到这一点,它看起来像这样:
[self.slider addTarget:self action:@selector(dragEndedForSlider:) forControlEvents:UIControlEventTouchUpInside];
当触摸结束时,会向您发送dragEndedForSlider:
消息。
如果你想在你的笔尖上做到这一点,你可以通过单击滑块来获得连接菜单,然后从“Touch Up Inside”套接字拖动到目标对象。
您还应该为UIControlEventTouchUpOutside
和UIControlEventTouchCancel
添加目标和操作。
我想你需要控制事件UIControlEventTouchUpInside
。
Swift 3.1
-
添加
touchUpInside
和touchUpOutside
事件的目标。 您可以通过编程或故事板来完成。 这是你如何编程slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
-
编写你的函数来处理滑块拖动的结束
func sliderDidEndSliding() { print("end sliding") }
斯威夫特3回答
我有同样的问题,并最终得到这个工作,所以也许这将有助于某人。 将滑块连接到故事板中的“Value Changed”,当滑块移动“Slider Touched”动作,并松开“Slider Released”时。
@IBAction func your_Slider(_ sender: UISlider) { if (yourSlider.isTracking) { print("Slider Touched") } else { print("Slider Released") } }
Swift 3.1
有时您会希望滑块的拖动事件持续触发,但是可以根据滑块是否仍在被拖动或刚刚完成拖动来执行不同的代码。
为了做到这一点,我已经扩大了上面的Andy的答案,使用滑块的isTracking
属性。 我需要logging两个状态: 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 } }
连接Touch Up Inside
和Value Changed
像这样尝试
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); }
我最近有类似的问题。 这是我在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
默认情况下,是(是)。 把它设置为false就是你想要的东西。
- 在UIWebView中禁用用户select
- 重命名Xcode 6项目后出现错误:“链接器命令失败,退出代码1(使用-v查看调用)”
- 如何sorting一个NSMutableArray中的自定义对象?
- 如何样式UITextview喜欢圆angular矩形文本字段?
- 在iOS 6/7中,“表格单元没有被重用的索引path”消息的含义是什么?
- 是否可以使用Firebase云消息传递(FCM)直接从设备发送PushNotifications到特殊的UDID?
- 在Objective-C中检查空string的正确方法是什么?
- UIView框架,边界和中心
- DTAssetProviderService无法启动与模拟器的DTXConnection