vds_ios/VDS/Publishers/UIGestureRecognizer+Publisher.swift
Matt Bruce b95af61bdc renamed method since it was failing
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2022-11-08 15:08:58 -06:00

61 lines
1.9 KiB
Swift

//
// UIGestureRecognizer.swift
// VDS
//
// Created by Matt Bruce on 8/31/22.
//
import Foundation
import UIKit
import Combine
extension UIView {
public func publisher<G>(for gestureRecognizer: G) -> UIGestureRecognizer.Publisher<G> where G: UIGestureRecognizer {
UIGestureRecognizer.Publisher(gestureRecognizer: gestureRecognizer, view: self)
}
}
extension UIGestureRecognizer {
public struct Publisher<G>: Combine.Publisher where G: UIGestureRecognizer {
public typealias Output = G
public typealias Failure = Never
public let gestureRecognizer: G
public let view: UIView
public func receive<S>(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input {
subscriber.receive(
subscription: Subscription(subscriber: subscriber, gestureRecognizer: gestureRecognizer, on: view)
)
}
}
public class Subscription<G: UIGestureRecognizer, S: Subscriber>: Combine.Subscription where S.Input == G, S.Failure == Never {
public var subscriber: S?
public let gestureRecognizer: G
public let view: UIView
public init(subscriber: S, gestureRecognizer: G, on view: UIView) {
self.subscriber = subscriber
self.gestureRecognizer = gestureRecognizer
self.view = view
gestureRecognizer.addTarget(self, action: #selector(gestureHandler))
view.addGestureRecognizer(gestureRecognizer)
}
@objc private func gestureHandler(_ gesture: UIGestureRecognizer) {
_ = subscriber?.receive(gestureRecognizer)
}
public func cancel() {
view.removeGestureRecognizer(gestureRecognizer)
}
public func request(_ demand: Subscribers.Demand) { }
}
}