Skip to content

Instantly share code, notes, and snippets.

@maximkrouk
Last active July 8, 2022 09:22
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maximkrouk/942125396a857e49203ddb933d557c31 to your computer and use it in GitHub Desktop.
Save maximkrouk/942125396a857e49203ddb933d557c31 to your computer and use it in GitHub Desktop.
Custom proxy for UIFeedbackGenerator subclasses
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() }
}
}
@maximkrouk
Copy link
Author

maximkrouk commented Feb 1, 2021

Usage

Haptic.light()
Haptic.light.trigger()
Haptic.light(intencity: 0.5).trigger()
Haptic.light(intencity: 0.5)()
let haptic = Haptic.error
haptic.trigger()
let haptic = Haptic.error
haptic()

Here is a new version

Back to index

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment