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