在 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'不起作用