如何在 iOS 中延迟 UISlider 的开始触摸事件?

Posted

技术标签:

【中文标题】如何在 iOS 中延迟 UISlider 的开始触摸事件?【英文标题】:How to delay start touch event of a UISlider in iOS? 【发布时间】:2017-10-06 04:39:40 【问题描述】:

在我的应用程序中,有一个 UISlider 只能在长按后滑动(比如说,在按下 0.1 秒后)。为了防止滑块立即交互,我将mySlider.isUserInteractionEnabled = false 设置为默认值。但是,由于.isUserInteractionEnabled 将禁用所有功能,包括长按手势,我使用另一个与顶部滑块大小相同的透明UIButton 来检测长按,并将mySlider.isUserInteractionEnabled = true 设置为回调动作。这很好用,只是必须先释放UIButton,然后用户再次点击滑块以滑动它,而不是在同一触摸内直接拖动滑块。这使得滑块使用起来非常不方便。因此,我想知道是否:

    除了我的方法之外,还有更好的方法让 UISlider 仅在一定延迟后才开始滑动?我很惊讶我找不到任何解决方案。我认为这是将滑块锁定在某个点的常见需求。

    按照我的解决方案,有什么方法可以让我在同一次触摸中开始拖动滑块?

非常感谢您的任何回答。

补充:我的解决方案如下:在TableViewCell中,有一个标签,一个滑块,和一个与滑块大小相同的不可见按钮(灰色背景区域) .我设置滑块属性isUserInteractionEnabled == false,然后添加手势识别器来操作滑块(例如单击、双击用于我的自定义功能,以及启用滑块的长按手势)。长按按钮后,滑块的isUserInteractionEnabled 将设置为true,直到拇指变为新值。

基本上我只想禁用滑块对短按响应太快,滑块的其他功能将保持不变。我想可能有更好的方法来实现这一点,到目前为止,使用透明按钮是我能想到的唯一方法。

【问题讨论】:

如果你能提供一个演示来测试,那么它会有助于解决你的问题 @VarunNaharia 我已经添加了一些关于到目前为止我如何满足我的需求的信息。这可行,但是由于前面有一个按钮,所以在设置为启用滑块用户交互后,我必须释放按钮然后再次按下才能拖动,这完全不直观。我想要的是一个普通的滑块,只是它只在一定延迟后才开始拖动。 【参考方案1】:

您可以禁用滑块上的用户交互,然后在其上添加手势识别器(虽然不太确定用户交互)。也许做这样的事情

let longPress = UILongPressGestureRecognizer(target: self.slider, action: Selector("longPressAndSlide:"))
longPress.minimumPressDuration = 0
self.addGestureRecognizer(longPress)

longPressAndSlide中,您可以计算移动的方向和增量,并相应地设置滑块的值。

这实际上已被多次回答。只是更好的搜索会为您提供更多帮助。

更新 检查答案 - How to enable "tap and slide" in a UISlider?

最新更新 正如 cmets 建议的那样,我们可以在滑块顶部添加一个按钮,并在其上添加 longPress 手势。处理可以在手势的处理程序 Action 中完成。

【讨论】:

您好,感谢您的精彩回答。最后,我仍然将longPress 放在我的隐形按钮中并一直禁用滑块,因为一旦禁用了用户交互,就不会检测到滑块 longPress。

以上是关于如何在 iOS 中延迟 UISlider 的开始触摸事件?的主要内容,如果未能解决你的问题,请参考以下文章

UISlider 延迟调用touchesBegan,延迟调用valueChangeHandle。delay?

UISlider拖动在iOS中表现异常

如何在 iOS 中使用 MpMoviePlayerController 在 UISlider 上显示缓冲数据?

iOS >> 如何识别用户离开 UISlider Thumb 属性的手势?

iOS 如何从 UISlider 中删除发光/阴影

UISlider 详细信息 iOS 5.1 中 Splitviewcontroller 的视图损坏