61 lines
1.9 KiB
Swift
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) { }
|
|
}
|
|
}
|