TriggerKit

Swift Versions

Platforms

Licence

TriggerKit 是一个轻量级的 Swift 包,旨在通过响应状态变化(通过修饰符或标准协议)来构建响应式用户界面行为。它特别适用于创建模块化、可重用的 UI 组件,并且可以作为构建更大、功能更丰富的包的强大基础构建块。

特性

安装

使用 Swift Package Manager 将 TriggerKit 添加到您的 Swift 项目。

dependencies: [
  .package(url: "https://github.com/markbattistella/TriggerKit", from: "1.0.0")
]

或者,您可以通过 Xcode 添加 TriggerKit,方法是导航到 File > Add Packages 并输入包存储库 URL。

推荐用法

注意

虽然您可以直接在代码中使用此包,但建议将其包装在另一个包或库中,以将其集成到更大的系统中。这种设计模式有助于降低耦合性,从而更容易使用和维护您的应用程序。 StateChangeModifierTriggerActionPerformable 旨在作为其他包中更复杂的状态驱动行为的基础构建块,而不是直接在所有实例中使用。

用法

在另一个 Swift 包中使用 TriggerKit

与其直接在您的应用程序代码中使用 TriggerKit,不如考虑将其包装在一个自定义包中,以添加其他功能。 下面是一个示例,说明如何使用 TriggerKit 通过状态更改来管理触觉反馈。

包装 TriggerKit 用于触觉反馈

提示

参见:HapticsManager Swift 包

让我们创建一个使用 TriggerKit 实现触觉反馈的包

  1. 为反馈设置定义自定义用户默认键
public struct HapticFeedbackSettings {
    internal static var isAvailable: Bool { 
      CHHapticEngine.capabilitiesForHardware().supportsHaptics // system level checks
    }
    internal static var isEnabled: Bool { 
      userIsPayingCustomer && !userNeedsHapticFeedback // your custom checks
    }
}
  1. 为触觉反馈定义自定义执行者
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 }
}
  1. 为触觉反馈定义 SwiftUI 视图修饰符

接下来,我们使用 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 文件。