暂时禁用 UISlider 交互

Posted

技术标签:

【中文标题】暂时禁用 UISlider 交互【英文标题】:Disable UISlider interaction temporarily 【发布时间】:2016-07-18 19:04:08 【问题描述】:

UISlider 达到给定进度时,我正在尝试运行performSegue:,所以我希望它只执行一次。是否可以立即禁用滑动交互?

我已经尝试过使用resignFirstResponder,将enableduserInteractionEnabled 设置为false 并返回true,并遍历相关的手势识别器来禁用和启用它们。这些替代方案都没有产生预期的效果。

我希望控件对未来的事件保持活动状态,但要停止当前事件的交互。禁用用户交互并禁用它并不能解决我的问题。

【问题讨论】:

【参考方案1】:

使用布尔实例变量triggered。当您响应 ValueChanged 事件时检查它是否正确,如果是,请退出。否则将变量设置为 true 并执行你的 segue。在 TouchCancel 事件上将变量设置回 false。

【讨论】:

交互并没有停止,用户仍然可以滑动滑块【参考方案2】:

由于 UISlider 从 UIControl 继承,将控件的布尔值设置为 YES 或 NO - 将切换其启用状态。如果禁用,滑块将看起来不透明。 同样作为 UIControl 从 UIView 继承,设置 userInteractionEnabled 的布尔值 - 将切换是否忽略用户事件。如果禁用,滑块将看起来正常但不会移动等。

但是 - 如果您已经开始使用滑块并且它的使用选择了一个方法,并且在该方法中您使用了 .enabled 或 .userInteractionEnabled,那么它会持续触发直到您松开,即重复调用该方法。一旦你放手,你的控制设置就会起作用。 为避免多次执行被调用的方法,您可以在该方法的开头查询标志的状态,如果设置为是,则从该方法返回。查询后立即将 Bool 标志设置为 yes,当然 - 在代码中有意义的地方(当方法已达到其目的时)再次将标志设置为 no(或者可能将连续属性设置为 NO 已经有帮助) :

    -(void)methodSelectedBySlider
    
    if (_inSelectedMethodFlag==YES) 
       return;
    

   _inSelectedMethodFlag = YES;

【讨论】:

以上是关于暂时禁用 UISlider 交互的主要内容,如果未能解决你的问题,请参考以下文章

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

Angular uislider 禁用

UITableView 中的 UISlider 没有响应滑动手势

启用用户交互的 FadeIn 和 FadeOut UISlider

试图操纵 UISlider 的 userInteractionEnabled 属性:不工作

UISlider