我可以通过以下方式检测特定视图中的单/双击:
NSSet *myTouches = [event touchesForView:mySpecificView.view];
但我想检测滑块按钮上的双击并找不到任何引用。是否有“touchesForView:”的替代品,我可以在其中输入滑块的名称?
用法:我有三个滑块,其默认值直接位于滑块的中心。一旦滑块的位置发生变化,我想快速将每个滑块重置为默认位置。
我目前每个滑块包含的视图设置为响应双击,更新每个滑块。它工作正常,但似乎并不自然。 ie.I不能双击滑块本身,因为滑块拦截了水龙头并且没有将它们传递到周围的视图。
提前致谢
答案 0 :(得分:1)
通过使用两种方法,将滑块的TouchDownRepeat事件连接到一个(doubleTapSlider)和相同滑块的TouchUpInside事件到另一个(releaseSliderBtn),我能够获得我正在寻找的确切功能。我需要三个单独的滑块,所以我给它们分配了5,6和6的标签。 7在Interface Builder中检测哪一个正在调用我的方法。
用户双击一个滑块球,将球移回中心并将标签设置为100.如果我没有releaseSliderBtn方法,当用户发布第二次点击时,标签将保持为100 ,但球会跳回到用户释放第二个水龙头的位置。现在,通过检查标签的当前文本,当用户释放第二个点击时,球保持在中心位置。滑块1的范围是50~150。滑块2的范围是-12~ + 12。滑块3的范围是-49~ + 49。
仅供参考:出于某种原因,'else if'不适用于releaseSliderBtn,因此我将它们作为三个单独的if语句。
-(IBAction)doubleTapSlider:(id)sender {
printf ("Sender: %d\n", [sender tag]);
if([sender tag] == 5){
playbackSpeedSlider.value = 100;
playbackSpeedLabel.text = @"100";
} else if ([sender tag] == 6) {
halfStepSlider.value = 0;
halfStepLabel.text = @"0";
} else if ([sender tag] == 7) {
centsSlider.value = 0;
centsLabel.text = @"0";
}
}
-(IBAction)releaseSliderBtn:(id)sender {
printf ("Sender: %d\n", [sender tag]);
if([sender tag] == 5){
if(playbackSpeedLabel.text == @"100"){
playbackSpeedSlider.value = 100;
}
}
if ([sender tag] == 6) {
if(halfStepLabel.text == @"0"){
halfStepSlider.value = 0;
}
}
if ([sender tag] == 7) {
if(centsLabel.text == @"0"){
centsSlider.value = 0;
}
}
}
答案 1 :(得分:0)
当我遇到你的问题时,我正在寻找一种方法将触摸事件从UISlider传递到UITableView。
如果您现在还没有想出来,或者对于有类似问题的其他人,您可以通过设置一个操作方法来检测UISlider对象的双击,如下所示:
- (void)loadView {
UISlider *slider = [[UISlider alloc] initWithFrame:sliderBackground.frame];
[view addSubview:slider];
// Set the slider action method
[slider addTarget:self
action:@selector(sliderDoubleTap:)
forControlEvents:UIControlEventTouchDownRepeat];
}
- (void) sliderDoubleTap: (UISlider *) sender {
NSLog(@"Slider Double Tap");
}
答案 2 :(得分:0)
针对Swift 3.0进行了更新
这是一个老问题,我偶然发现了解决添加双击识别器以重置滑块几乎相同的问题。
原始答案通过添加回复UIControlEvents.touchDownRepeat
的操作为我们指明正确的方向。
这可以通过在视图控制器中添加一行来快速完成(例如在viewDidLoad()
方法中:
override func viewDidLoad()
{
super.viewDidLoad()
self.slider.addTarget(self, action: #selector(sliderTouchDownRepeat(_ :)), for: .touchDownRepeat)
}
您可以在选择器中做出相应的回应:
@objc func sliderTouchDownRepeat(_ slider: UISlider)
{
//Respond to double tap here
}
这一切都很好,但如果您计划在识别双击时更改滑块值,则还需要一些额外的代码片段。
首先,还要为UIControlEvents.valueChanged
override func viewDidLoad()
{
super.viewDidLoad()
self.slider.addTarget(self, action: #selector(sliderTouchDownRepeat(_ :)), for: .touchDownRepeat)
self.slider.addTarget(self, action: #selector(sliderDidChange(_:)), for: .valueChanged)
}
取消我们正在回复的当前触地事件,以便滑块不会立即返回到双击位置slider.cancelTracking(with: nil)
并调用UIControlEvents.valueChanged
@objc func sliderTouchDownRepeat(_ slider: UISlider)
{
slider.cancelTracking(with: nil)
// Perform your own value change operation
// self.reset()
self.sliderDidChange(slider)
}
@objc func sliderDidChange(_ slider: UISlider)
{
//Update any other UI here
}
快乐编码