Initial Commit
This commit is contained in:
commit
2508919f97
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
.DS_Store
|
||||
/.build
|
||||
/Packages
|
||||
xcuserdata/
|
||||
DerivedData/
|
||||
.swiftpm/configuration/registries.json
|
||||
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
|
||||
.netrc
|
23
Package.swift
Normal file
23
Package.swift
Normal file
@ -0,0 +1,23 @@
|
||||
// swift-tools-version: 5.7
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "FeedbackKit",
|
||||
platforms: [
|
||||
.iOS(.v15),
|
||||
],
|
||||
products: [
|
||||
.library(
|
||||
name: "FeedbackKit",
|
||||
targets: ["FeedbackKit"]),
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
name: "FeedbackKit",
|
||||
dependencies: [],
|
||||
path: "Sources"
|
||||
),
|
||||
],
|
||||
swiftLanguageVersions: [.v5]
|
||||
)
|
67
Sources/FeedbackKit/FeedbackKit.swift
Normal file
67
Sources/FeedbackKit/FeedbackKit.swift
Normal file
@ -0,0 +1,67 @@
|
||||
// The Swift Programming Language
|
||||
// https://docs.swift.org/swift-book
|
||||
|
||||
import UIKit
|
||||
import SwiftUI
|
||||
|
||||
enum FeedbackType {
|
||||
case light
|
||||
case medium
|
||||
case hard
|
||||
case custom(Int)
|
||||
}
|
||||
|
||||
struct FeedbackModifier: ViewModifier {
|
||||
@Binding var trigger: Bool
|
||||
var type: FeedbackType
|
||||
var hapticValue: Int?
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
content
|
||||
.onChange(of: trigger) { newValue in
|
||||
if newValue {
|
||||
provideFeedback(for: type, hapticValue: hapticValue)
|
||||
trigger = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func provideFeedback(for type: FeedbackType, hapticValue: Int?) {
|
||||
let generator: UIImpactFeedbackGenerator
|
||||
|
||||
switch type {
|
||||
case .light:
|
||||
generator = UIImpactFeedbackGenerator(style: .light)
|
||||
case .medium:
|
||||
generator = UIImpactFeedbackGenerator(style: .medium)
|
||||
case .hard:
|
||||
generator = UIImpactFeedbackGenerator(style: .heavy)
|
||||
case .custom(let intensity):
|
||||
if let hapticValue = hapticValue {
|
||||
let customGenerator = UIImpactFeedbackGenerator(style: intensityForValue(hapticValue))
|
||||
customGenerator.impactOccurred()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
generator.impactOccurred()
|
||||
}
|
||||
|
||||
private func intensityForValue(_ value: Int) -> UIImpactFeedbackGenerator.FeedbackStyle {
|
||||
switch value {
|
||||
case 1:
|
||||
return .light
|
||||
case 2:
|
||||
return .medium
|
||||
default:
|
||||
return .heavy
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension View {
|
||||
func feedback(trigger: Binding<Bool>, type: FeedbackType = .hard, haptic: Int? = nil) -> some View {
|
||||
self.modifier(FeedbackModifier(trigger: trigger, type: type, hapticValue: haptic))
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user