【问题标题】:Detecting touches on a UISlider?检测 UISlider 上的触摸?
【发布时间】:2012-06-10 18:18:06
【问题描述】:

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

我尝试过使用:

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

但这在结束对滑块的触摸时不起作用。

【问题讨论】:

  • 为什么不使用UIControlEventTouchUpInsideUIControlEventTouchUpOutside 的目标+操作?
  • 这是一个很好的建议!我不知道您可以在 UISlider 上使用 UIControlEventTouchUpInside,但它确实有效! :)

标签: objective-c ios xcode cocoa-touch uislider


【解决方案1】:

您可以使用两个控制事件来检测触摸何时结束;试试

[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];

【讨论】:

    【解决方案2】:

    不要使用touchesEnded:(无论如何不应将其用于此目的),而是将操作附加到UISliderUIControlEventValueChanged 事件并将UISlidercontinuous 属性设置为@ 987654326@,所以当用户完成选择一个值时会触发该事件。

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

    【讨论】:

    • 这是一个好主意,但我已经在使用UIControlEventValueChanged 来获取 UISlider 所在位置的实时更新,所以如果我将 continuous 设置为 no,我就无法做到这一点。
    • 所以您想实时获取该值,但仅在用户停止触摸时应用该值?这应该在您的问题中说明。
    【解决方案3】:

    我无法捕捉到触摸的开始和结束,但在 RTFD-ing 之后,我想出了一些可以同时兼顾的东西。

      @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() 只是我编写的用于在触摸开始和结束时处理动画的方法。如果它不是开始或结束,则它是 default 并且滑块值会更新。

    【讨论】:

    • 您为 sliderAction() 使用哪种控制事件类型?是 UIControlEvents.allTouchEvents 吗?
    • @Hamed 当您从情节提要中拖出连接时,将其设为操作并在参数下,确保您指定发送者和(强调我的)事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2013-06-25
    • 2015-08-03
    相关资源
    最近更新 更多