Created
April 29, 2021 10:48
-
-
Save ollieatkinson/7701afb9df569591c7125ae6a8cd4468 to your computer and use it in GitHub Desktop.
Combine publisher for UIGestureRecognizer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension UIView { | |
func publisher<G>(for gestureRecognizer: G) -> UIGestureRecognizer.Publisher<G> where G: UIGestureRecognizer { | |
UIGestureRecognizer.Publisher(gestureRecognizer: gestureRecognizer, view: self) | |
} | |
} | |
extension UIGestureRecognizer { | |
struct Publisher<G>: Combine.Publisher where G: UIGestureRecognizer { | |
typealias Output = G | |
typealias Failure = Never | |
let gestureRecognizer: G | |
let view: UIView | |
func receive<S>(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input { | |
subscriber.receive( | |
subscription: Subscription(subscriber: subscriber, gestureRecognizer: gestureRecognizer, on: view) | |
) | |
} | |
} | |
class Subscription<G: UIGestureRecognizer, S: Subscriber>: Combine.Subscription where S.Input == G, S.Failure == Never { | |
var subscriber: S? | |
let gestureRecognizer: G | |
let view: UIView | |
init(subscriber: S, gestureRecognizer: G, on view: UIView) { | |
self.subscriber = subscriber | |
self.gestureRecognizer = gestureRecognizer | |
self.view = view | |
gestureRecognizer.addTarget(self, action: #selector(handle)) | |
view.addGestureRecognizer(gestureRecognizer) | |
} | |
@objc private func handle(_ gesture: UIGestureRecognizer) { | |
_ = subscriber?.receive(gestureRecognizer) | |
} | |
func cancel() { | |
view.removeGestureRecognizer(gestureRecognizer) | |
} | |
func request(_ demand: Subscribers.Demand) { } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment