TriggerKit
是一个轻量级的 Swift 包,旨在通过响应状态变化(通过修饰符或标准协议)来构建响应式用户界面行为。它特别适用于创建模块化、可重用的 UI 组件,并且可以作为构建更大、功能更丰富的包的强大基础构建块。
StateChangeModifier
为 SwiftUI 视图添加响应式行为。TriggerActionPerformable
以标准化在整个应用程序中处理触发器和操作的方式。使用 Swift Package Manager 将 TriggerKit
添加到您的 Swift 项目。
dependencies: [
.package(url: "https://github.com/markbattistella/TriggerKit", from: "1.0.0")
]
或者,您可以通过 Xcode 添加 TriggerKit
,方法是导航到 File > Add Packages
并输入包存储库 URL。
注意
虽然您可以直接在代码中使用此包,但建议将其包装在另一个包或库中,以将其集成到更大的系统中。这种设计模式有助于降低耦合性,从而更容易使用和维护您的应用程序。 StateChangeModifier
和 TriggerActionPerformable
旨在作为其他包中更复杂的状态驱动行为的基础构建块,而不是直接在所有实例中使用。
与其直接在您的应用程序代码中使用 TriggerKit
,不如考虑将其包装在一个自定义包中,以添加其他功能。 下面是一个示例,说明如何使用 TriggerKit
通过状态更改来管理触觉反馈。
提示
参见:HapticsManager Swift 包
让我们创建一个使用 TriggerKit
实现触觉反馈的包
public struct HapticFeedbackSettings {
internal static var isAvailable: Bool {
CHHapticEngine.capabilitiesForHardware().supportsHaptics // system level checks
}
internal static var isEnabled: Bool {
userIsPayingCustomer && !userNeedsHapticFeedback // your custom checks
}
}
public struct HapticFeedbackPerformer<T: Equatable>: TriggerActionPerformable, FeedbackSettingsConfigurable {
public typealias Trigger = T
public enum Feedback {
case impact(UIImpactFeedbackGenerator.FeedbackStyle)
}
public static var isAvailable: Bool { HapticFeedbackSettings.isAvailable }
public static var isEnabled: Bool { HapticFeedbackSettings.isEnabled }
public static func perform(_ feedback: Feedback) {
// your logic here
}
public static func canPerform() -> Bool { isAvailable && isEnabled }
}
接下来,我们使用 StateChangeModifier
创建一个视图修饰符,该修饰符根据触发器状态变化提供触觉反馈
public extension View {
func hapticFeedback<T: Equatable>(
_ feedback: HapticFeedbackPerformer<T>.Feedback,
trigger: T
) -> some View {
self.modifier(
StateChangeModifier(
feedback,
trigger: trigger,
actionHandler: { feedback in
guard HapticFeedbackPerformer<T>.canPerform() else { return }
HapticFeedbackPerformer<T>.perform(feedback)
}
)
)
}
}
import SwiftUI
struct ContentView: View {
@State private var isButtonTapped = false
var body: some View {
Button(action: {
isButtonTapped.toggle()
}) {
Text("Tap Me")
}
.hapticFeedback(
.impact(.light),
trigger: isButtonTapped
)
}
}
在此示例中,每次点击按钮时,都会提供轻微的触觉冲击反馈,但前提是已启用触觉并且可用。
欢迎贡献! 请 Fork 该存储库并提交一个 Pull Request,以进行任何功能、修复或改进。
TriggerKit
在 MIT 许可证下可用。 有关更多信息,请参见 LICENCE 文件。