2009-09-08 67 views
1

我可以检测具体意见单/双水龙头有:检测UISlider上的双击?

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

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

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

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

在此先感谢

+0

*凹凸*无论这是一件没有人做过/想要做的,或者它是如此简单每个人都认为我会绊倒交流罗斯吧。无论哪种方式,我仍然坚持。任何人? – Randy 2009-09-21 16:05:49

回答

1

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

用户双击滑块球,将球移回中心并将标签设置为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; 
    } 
    } 
} 
+0

好东西。谢谢! – Luke 2011-07-07 18:28:43

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"); 
} 
+0

感谢您的建议user211790,但这并不完全。我已经能够将滑块的TouchDownRepeat事件拖放到Interface Builder中的一个方法中,该方法允许我将滑块和滑块的标签(UILabel)都设置为“100”。问题是,一旦我释放第二次敲击,滑块就会跳回到我手指双击的地方。即“50”等。 我可以用两种方法弄清楚,见下文。 – Randy 2010-05-02 21:07:36

0

更新了雨燕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 
} 

快乐编码