Skip to content

Instantly share code, notes, and snippets.

@iamchiwon
Created December 14, 2021 01:33
Show Gist options
  • Select an option

  • Save iamchiwon/28d291ea09bb1f42dec2e26fbc52773e to your computer and use it in GitHub Desktop.

Select an option

Save iamchiwon/28d291ea09bb1f42dec2e26fbc52773e to your computer and use it in GitHub Desktop.
UIControl rx extension
import UIKit
import RxSwift
import RxCocoa
struct TargetedControlEvent<T> {
var event: UIControl.Event
var sender: T
}
extension Reactive where Base: UIControl {
func controlEvent(event: UIControl.Event) -> Observable<TargetedControlEvent<Base>> {
let targetedControlEvent = TargetedControlEvent(event: event, sender: base)
return base.rx.controlEvent(event).map({ _ in targetedControlEvent })
}
func controlEvent(events: [UIControl.Event]) -> Observable<TargetedControlEvent<Base>> {
return Observable.merge(events.map({ controlEvent(event: $0) }))
}
var allTouchEvents: Observable<TargetedControlEvent<Base>> {
let touchEvents: [UIControl.Event] = [
.touchDownRepeat,
.touchDragInside,
.touchDragOutside,
.touchDragEnter,
.touchDragExit,
.touchUpInside,
.touchUpOutside,
.touchCancel
]
return controlEvent(events: touchEvents)
}
var allEditingEvents: Observable<TargetedControlEvent<Base>> {
let editingEvents: [UIControl.Event] = [
.editingDidBegin,
.editingChanged,
.editingDidEnd,
.editingDidEndOnExit
]
return controlEvent(events: editingEvents)
}
var allEvents: Observable<TargetedControlEvent<Base>> {
let events: [UIControl.Event] = [
.valueChanged,
.applicationReserved,
.systemReserved
]
var eventObservables = events.map({ controlEvent(event: $0) })
eventObservables.append(contentsOf: [allTouchEvents, allEditingEvents])
return Observable.merge(eventObservables)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment