【问题标题】:Overriding isEnabled in UIControl to still allow touches在 UIControl 中覆盖 isEnabled 以仍然允许触摸
【发布时间】: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”。

标签: ios swift uicontrol


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多