如何使用位掩码在 Swift 2.2 中自定义 UIControlState?

Posted

技术标签:

【中文标题】如何使用位掩码在 Swift 2.2 中自定义 UIControlState?【英文标题】:How to have custom UIControlState in Swift 2.2 using bit masks? 【发布时间】:2016-08-23 21:33:57 【问题描述】:

我有一个自定义 UIButton,它具有一些我希望它具有的独特状态:

enum PositionControlState : Int 
    case Available = 0, Pending, Waiting, Approved, Declined

我做了一些谷歌搜索,发现了一些关于位掩码的东西,以及 Objective-c 中的 UIControlState.Application。我觉得我有一些拼图,但不太确定如何在 swift 2.2 中将它们组合在一起。

【问题讨论】:

Swift 使用 OptionSetType 而不是位掩码。 类似:\br struct PositionControlState : OptionSetType let rawValue: Int static let Available = UIControlState(rawValue: 0) static let Waiting = UIControlState(rawValue: 1 << 0) static let Pending = UIControlState(rawValue: 1 << 1) static let Approved = UIControlState(rawValue: 1 << 2) static let Declined = UIControlState(rawValue: 1 << 3) 是的,尽管你必须小心不要让任何原始值与已经内置的值发生冲突 【参考方案1】:

我不确定你是否解决了这个问题,但我做类似事情的方式是这样的。

extension UIControlState 
    static let available = UIControlState(rawValue: 1 << 5)
    static let pending   = UIControlState(rawValue: 1 << 6)
    static let waiting   = UIControlState(rawValue: 1 << 7)


class Button: UIButton 
    private var isAvailable = false
    private var isPending = false
    private var isWaiting = false

    private func aFuncCalledWhenPending() 
        isPending = true
    

    override var state: UIControlState 
        var s = super.state

        if isAvailable 
            s.insert(.available)
        
        if isPending 
            s.insert(.pending)
        
        if isWaiting 
            s.insert(.waiting)
        

        return s
    

这将允许您编写诸如button.setTitleColor(.red, for: .pending) 之类的代码。

这种方法的问题是,对于接受UIControlState 的所有函数,您的其他状态将是公开可见的。类似于UIControlEvents 有很多状态,但其中一些只用于特定的类。

请记住,如果您继续采用这种方法,您所包含的其他状态应保留在“控制状态”的相同上下文定义中。

【讨论】:

以上是关于如何使用位掩码在 Swift 2.2 中自定义 UIControlState?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中为 SpriteKit 定义类别位掩码枚举?

Swift 2/Xcode 7 beta - 多个位掩码产生错误

碰撞位掩码是如何工作的?斯威夫特/雪碧套件

位掩码是不是可以与位中的“访问数组”相媲美?

如何记录位掩码

是否可以在 WCF 服务的 DataContract 中定义位的使用?