在UISlider上检测触摸?

15

我在屏幕上有一个UISlider,我需要能够检测到用户何时停止触摸它。(这样我就可以淡化一些元素)。

我尝试使用:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

但是当在滑块上结束触摸时,它并不起作用。


4
为什么不使用 UIControlEventTouchUpInsideUIControlEventTouchUpOutside 的目标动作(target+action)? - user529758
1
这是一个很好的建议!我不知道你可以在 UISlider 上使用“UIControlEventTouchUpInside”,但它确实起作用! :) - Andrew Martin
3个回答

21

您可以使用两个控件事件来检测触摸结束;尝试一下

[slider addTarget:self action:@selector(touchEnded:) 
                       forControlEvents:UIControlEventTouchUpInside];

或者

[slider addTarget:self action:@selector(touchEnded:) 
                       forControlEvents:UIControlEventTouchUpOutside];

如果您想检测touchesEnd事件的两种类型,请使用以下方式。
[slider addTarget:self action:@selector(touchEnded:) 
   forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];

6

不要使用 touchesEnded:(它本来就不应该用于这个目的),而是将一个动作附加到 UISliderUIControlEventValueChanged 事件上,并将 UISlidercontinuous 属性设置为 NO,这样当用户完成选择值时,事件将被触发。

mySlider.continuous = NO;
[mySlider addTarget:self
          action:@selector(myMethodThatFadesObjects) 
          forControlEvents:UIControlEventValueChanged];

2
这是一个不错的想法,但我已经在使用UIControlEventValueChanged来获取UISlider的实时更新,所以如果我将continuous设置为否,我就无法这样做。 - Andrew Martin
所以你想实时获取值,但只有在用户停止触摸时才应用该值?这应该在你的问题中说明。 - Evan Mulawski

6

我无法找到任何东西来捕获触摸的开始和结束,但是通过阅读文档,我想出了一些可以同时实现这两个功能的方法。

  @IBAction func sliderAction(_ sender: UISlider, forEvent event: UIEvent) {

    if let touchEvent = event.allTouches?.first {
      switch touchEvent.phase {
      case .began:
        print("touches began")
        sliderTouchBegan()
      case .ended:
        print("touches ended")
        sliderTouchEnded()
      default:
        delegate?.sliderValueUpdated(sender.value)
      }
    }
  }

sliderTouchBegan()sliderTouchEnded()只是我编写的方法,用于处理触摸开始和结束时的动画效果。如果不是开始或结束,那么它就是一个默认值,并更新滑块的值。


你在sliderAction()中使用哪种控件事件类型?是UIControlEvents.allTouchEvents吗? - hamedazhar
@Hamed 当你从Storyboard中拖出连接时,将其设置为一个action,并在参数下确保你指定了sender和(重点是)event。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接