Я бы хотел немного улучшить эту стратегию. Посмотрите этот вопрос stackoverflow:
Переопределение isHighlighted все еще изменяет UIControlState - почему?
Оказывается, что реализация Apple state
на самом деле является вычисляемым свойством, основанным на других свойствах, isSelected
, isHighlighted
, isEnabled
и т. Д.
Так что на самом деле нет необходимости в настраиваемой битовой маске состояния поверх UIControlState (ну, это не так, что в этом нет необходимости, просто добавляется сложность там, где ее нет / не должно быть).
Если вы хотите быть совместимым с реализацией Apple, вам просто нужно переопределить свойство состояния и проверить свои пользовательские состояния в геттере.
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
.