我想对这个策略做一点改进。看到这个stackoverflow问题:
覆盖 isHighlighted 仍然会改变 UIControlState - 为什么?
事实证明,Apple 的state
实现实际上是基于其他属性 、 、 等的计算isSelected
属性。isHighlighted
isEnabled
所以实际上不需要在 UIControlState 之上自定义状态位掩码(好吧,并不是没有必要,只是它在需要/不应该的地方增加了复杂性)。
如果您想与 Apple 的实现保持一致,您只需覆盖 state 属性并在 getter 中检查您的自定义状态。
extension UIControlState {
static let myState = UIControlState(rawValue: 1 << 16)
}
class MyControl: UIControl {
override var state: UIControlState {
var state = super.state
if self.isMyCustomState {
state.insert(UIControlState.myState)
}
return state
}
var isMyCustomState: Bool = false
}
这实际上是一个聪明的方法。根据上面的链接,如果您覆盖该属性并且不更改状态,您将得到不一致的结果。使状态始终成为计算属性可确保state
表示的属性之间的一致性。