Initial Commit

This commit is contained in:
slds1 2024-09-24 15:39:39 +03:00
commit 2508919f97
3 changed files with 98 additions and 0 deletions

8
.gitignore vendored Normal file
View 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
View 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]
)

View 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))
}
}