-
-
Save maximkrouk/942125396a857e49203ddb933d557c31 to your computer and use it in GitHub Desktop.
Custom proxy for UIFeedbackGenerator subclasses
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
import UIKit | |
public struct Haptic { | |
private init(_ action: @escaping () -> Void) { | |
self.action = action | |
} | |
private var action: () -> Void | |
public func trigger() { action() } | |
public func callAsFunction() { trigger() } | |
public static func custom<Generator: UIFeedbackGenerator>( | |
_ generator: Generator, | |
_ action: @escaping (Generator) -> Void | |
) -> Haptic { | |
Haptic { action(generator) } | |
} | |
public static var light: Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .light)) { $0.impactOccurred() } | |
} | |
public static var medium: Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .medium)) { $0.impactOccurred() } | |
} | |
public static var heavy: Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .heavy)) { $0.impactOccurred() } | |
} | |
@available(iOS 13.0, *) | |
public static var soft: Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .soft)) { $0.impactOccurred() } | |
} | |
@available(iOS 13.0, *) | |
public static var rigid: Haptic { | |
let generator = UIImpactFeedbackGenerator(style: .rigid) | |
return Haptic { generator.impactOccurred() } | |
} | |
@available(iOS 13.0, *) | |
public static func light(intensity: CGFloat) -> Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .light)) { $0.impactOccurred(intensity: intensity) } | |
} | |
@available(iOS 13.0, *) | |
public static func medium(intensity: CGFloat) -> Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .medium)) { $0.impactOccurred(intensity: intensity) } | |
} | |
@available(iOS 13.0, *) | |
public static func heavy(intensity: CGFloat) -> Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .heavy)) { $0.impactOccurred(intensity: intensity) } | |
} | |
@available(iOS 13.0, *) | |
public static func soft(intensity: CGFloat) -> Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .soft)) { $0.impactOccurred(intensity: intensity) } | |
} | |
@available(iOS 13.0, *) | |
public static func rigid(intensity: CGFloat) -> Haptic { | |
.custom(UIImpactFeedbackGenerator(style: .rigid)) { $0.impactOccurred(intensity: intensity) } | |
} | |
public static var success: Haptic { | |
.custom(UINotificationFeedbackGenerator()) { $0.notificationOccurred(.success) } | |
} | |
public static var warning: Haptic { | |
.custom(UINotificationFeedbackGenerator()) { $0.notificationOccurred(.warning) } | |
} | |
public static var error: Haptic { | |
.custom(UINotificationFeedbackGenerator()) { $0.notificationOccurred(.error) } | |
} | |
public static var selection: Haptic { | |
.custom(UISelectionFeedbackGenerator()) { $0.selectionChanged() } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage
Back to index