この戦略を少し改良したいと思います。このstackoverflowの質問を参照してください:
isHighlightedをオーバーライドしてもUIControlStateは変更されます-なぜですか?
Appleのstate
実装は、実際には他のプロパティ、、、などに基づいて計算されたプロパティであることがisSelected
わかりisHighlighted
ますisEnabled
。
したがって、実際にはUIControlStateの上にカスタム状態ビットマスクは必要ありません(必要がないというわけではありません。必要がある/必要がない場所に複雑さを追加しているだけです)。
Appleの実装と一致したい場合は、stateプロパティをオーバーライドし、ゲッターでカスタム状態を確認するだけです。
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
表すプロパティ間の一貫性が保証されます。