在 UIControl 中覆盖 isEnabled 以仍然允许触摸

Posted

技术标签:

【中文标题】在 UIControl 中覆盖 isEnabled 以仍然允许触摸【英文标题】:Overriding isEnabled in UIControl to still allow touches 【发布时间】:2017-03-05 21:41:57 【问题描述】:

我有一个继承自 UIControl 的自定义滑块。

对于我的控件,isEnabled 状态仍应允许触摸,但当我覆盖 isEnabled 时,似乎 UIControl 也将 isUserInteractionEnabled 设置为 false。

无论我做什么,我似乎都无法阻止这种情况。有什么想法,还是我坚持为我的州创建另一个名称(即isBypassed)?

class CustomSlider: UIControl 

    private var _isEnabled: Bool = false

    override public var isEnabled: Bool 
        get  return _isEnabled 
        set  setIsEnabled(newValue, animated: false 
    

    public func setIsEnabled(_ isEnabled: Bool, animated: Bool) 
        self._isEnabled = isEnabled
        if animated 
            //do the animation...
        
    


附:如果您想知道我为什么要这样做,那是因为被禁用的控件在被触摸时应该仍然能够识别自己:它会短暂亮起,但很快就会消失,表明需要启用它才能进行进一步的交互。

如果我想阻止所有用户交互,我会使用isUserInteractionEnabled

【问题讨论】:

您能稍微扩展一下您所说的“识别自己”是什么意思吗?可能有另一种内置方法可以做到这一点,具体取决于它是什么。 谢谢。添加了更多信息。 您是否尝试过相反的方法?有人可能会争辩说禁用的控件是禁用的,但启用的控件应该能够识别自己,即使用户交互被关闭。您是否尝试过覆盖 isUserInteractionEnabled 而不是 isEnabled 我有 3 个这样的滑块,当应用程序启动时它们都“变灰”。然后用户进入“启用控件模式”,并点击他们想要启用的滑块,然后将它们变为现实。所以(在我的情况下)'isEnabled' 似乎是更好的语义,因为用户仍然可以与禁用的控件交互。如果只是命名问题,我能想到的下一个最佳词是“isActivated”或“isActive”。 【参考方案1】:

我能想到的唯一方法是使用0.5 alpha 将滑块设置为灰色(您可以调整 alpha 以使其看起来像已禁用)。

另外,创建一个BOOL 属性来标识其状态(活动/非活动)

所以当用户触摸滑块时,它仍然会响应valueChanged:(无论你给它什么选择器)

【讨论】:

以上是关于在 UIControl 中覆盖 isEnabled 以仍然允许触摸的主要内容,如果未能解决你的问题,请参考以下文章

被覆盖的 UIControl 或 UIView 如何知道在其上方结束的触摸事件?

在UIButton上覆盖'isSelected'或'isEnabled'不起作用

自定义 UIControl 和手势识别器

防止触摸从 UIControl 传递到 ParentView

不知道从哪里开始继承 UIControl!

将触摸结束事件发送到 UIControl 子类