UISlider 事件

Posted

技术标签:

【中文标题】UISlider 事件【英文标题】:UISlider events 【发布时间】:2011-01-12 01:15:53 【问题描述】:

我正在使用 UISlider,它会自动更新,除非用户触摸滑块按钮。因此我在由 NSTimer 自动更新的函数中做到了这一点:

if (!isSliderTouched) 
    [progressSlider setValue: progressValue];

当用户松开手指时,我如何跟踪此事件的结束。只要用户与此控件交互,我就想设置 isSliderTouched。

编辑:这应该是情节:

    用户开始拖动/触摸 UISlider => isSliderTouched = YES 用户释放/取消触摸 UISlider => isSliderTouched = NO

解决方案

UIControlEventTouchDown
UIControlEventTouchUpInside
[progressSlider addTarget:self action:@selector(sliderMoveStart) forControlEvents:UIControlEventTouchDown];

干杯

【问题讨论】:

我已经读了好几遍了,但我仍然不清楚你想要什么。但 TouchUpInside 是您在何时听以确定用户何时拿起手指的事件。 我试图更好地解释它,请参阅更新 TouchUpInSide 被调用了两次 :( 【参考方案1】:

你可以使用:

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

检测touchDowntouchUp 事件何时发生。你可以相应地设置你的标志。

我从您的代码 sn-p 猜测您正在使用 UISlider 作为进度表。您是否考虑过使用 UIProgressView 代替?

【讨论】:

谢谢您的提示。 UIProgressView 没有滑动按钮,所以这不是我需要的 连续参数就是你需要的developer.apple.com/library/ios/documentation/uikit/reference/… 不确定关于 SO 的规则,只是想向你们表明对于 UISlider 控件有更好的方法来执行此操作。看我的回答。【参考方案2】:

这被标记为已解决,但我想为此添加另一个我觉得更干净的解决方案。

if (!progressSlider.highlighted) 
    [progressSlider setValue: progressValue];

【讨论】:

一些人出于某种原因投了反对票。也许我应该更好地解释一下: UISlider 对象具有“突出显示”属性,当滑块被触摸/拖动时为 YES。您可以直接使用它来计算何时更新值以及何时不更新。如果有人想投反对票,请告诉我您认为答案有什么问题:) 对我来说,这种方法似乎可以检测到第一次按下滑块的时间而不是释放它的时间。 Max,它实际上给出了状态(触摸或未触摸),而不是检测按下或释放事件。提出问题的人想要设置是基于开始/结束事件的SliderTouched。我建议他可以只使用“突出显示”属性,而不是创建 isSliderTouched 并确定触摸的开始和结束。 我正在开发一个使用 UISlider 作为进度控件的自定义音频播放器。而这正是我所需要的。它很优雅。非常感谢!【参考方案3】:

跟踪用户是否完成与 UISlider 交互的更好方法是使用连续标志。

如果您只想在操作完成并且用户将手指移开之后才触发滑块操作,请使用

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

否则默认设置为YES。

[blurSlider  addTarget:self action:@selector(blurSliderChanged) forControlEvents:UIControlEventValueChanged];
    blurSlider.continuous = YES;

【讨论】:

【参考方案4】:

当用户触摸滑块时,您可以设置一个布尔变量标志并将其设为“否”。并在更新方法中检查标志是 YES 还是 NO。

【讨论】:

我想你误会了我。我希望用户可以使用滑块,但不希望自动更新过程在用户使用它时进行更新。 你必须使用 valueChanged 方法或将触发连接到 valueChanged 的​​函数的函数 不,当用户触摸了按钮但没有移动时。自动更新如下。 在滑块的触摸事件上,您可以设置一个布尔变量标志并将其设为否。并在更新方法中检查标志是 YES 还是 NO。

以上是关于UISlider 事件的主要内容,如果未能解决你的问题,请参考以下文章

UISlider 事件

UICollectionViews 线索内的 UISlider 不接收触摸事件

当 UISlider 一直拖到最后时会触发啥事件?

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

UISlider 返回两个 Touch Up Inside 事件,为啥会这样?

需要将使用 Interface Builder 创建的 UISlider 连接到非事件代码