Я не думаю, что есть элегантное решение, но я нашел хакерское решение, которое действительно работает.
UISwitch имеет подпредставление, к которому прикреплены 2 распознавателя жестов: один для длительного нажатия и один для панорамирования. Если вы подклассом UISwitch удалите эти распознаватели жестов и добавите новый сразу после инициализации, вы можете добиться неанимированного поведения.
Имейте в виду, что это решение может не работать в будущих версиях iOS, поскольку внутренняя реализация, на которую опирается это решение, может измениться.
Вот фрагмент кода, который работал для меня:
class PTSwitch: UISwitch {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let firstSubview = subviews[0]
guard let gestureRecognizers = firstSubview.gestureRecognizers else {
return
}
for recognizer in gestureRecognizers {
firstSubview.removeGestureRecognizer(recognizer)
}
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(gestureRecognized))
firstSubview.addGestureRecognizer(tapGestureRecognizer)
}
@objc func gestureRecognized() {
setOn(!isOn, animated: false)
}
}
Как видите, я удалил встроенные средства распознавания жестов и добавил средство распознавания жестов касанием. Вы также можете добавить другой для распознавания жестов панорамирования, он также должен работать. Затем в функции обратного вызова распознавателя жестов я просто использовал функцию setOn
из UISwitch с animated: false
для отключения анимации.