检测UISlider上的双击?

时间:2009-09-08 07:48:25

标签: iphone touch uislider

我可以通过以下方式检测特定视图中的单/双击:

NSSet *myTouches = [event touchesForView:mySpecificView.view];

但我想检测滑块按钮上的双击并找不到任何引用。是否有“touchesForView:”的替代品,我可以在其中输入滑块的名称?

用法:我有三个滑块,其默认值直接位于滑块的中心。一旦滑块的位置发生变化,我想快速将每个滑块重置为默认位置。

我目前每个滑块包含的视图设置为响应双击,更新每个滑块。它工作正常,但似乎并不自然。 ie.I不能双击滑块本身,因为滑块拦截了水龙头并且没有将它们传递到周围的视图。

提前致谢

3 个答案:

答案 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
}

快乐编码