1

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

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

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

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

我目前将每个滑块的包含视图设置为响应双击,更新每个滑块。它工作正常,但似乎不自然。即。我不能双击滑块本身,因为滑块会拦截点击并且不会将它们传递给周围的视图。

提前致谢

4

3 回答 3

1

通过使用两种方法,将滑块的 TouchDownRepeat 事件连接到一个 (doubleTapSlider) 并将同一滑块的 TouchUpInside 事件连接到另一个 (releaseSliderBtn),我能够获得我正在寻找的确切功能。我需要为三个单独的滑块使用它,所以我在 Interface Builder 中为它们分配了 5、6 和 7 的标签,以检测哪个滑块正在调用我的方法。

用户双击一个滑块球,它将球移回中心并将标签设置为 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; 
    }
  }
}
于 2010-05-02T21:27:40.270 回答
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");
}
于 2010-02-25T12:39:30.600 回答
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
}

快乐编码

于 2016-11-23T00:19:44.387 回答