SwiftUI 如何实现iPhone来电、闹钟场景下的系统振动效果
解决方案
方法1:调用系统标准振动(适配来电/定时器效果)
你当前使用的UINotificationFeedbackGenerator是系统提供的轻量级交互触觉反馈接口,天生设计为短时长、低强度的交互提示,无法实现来电、定时器触发时的强振动效果。你可以通过引入AudioToolbox框架调用系统级振动能力实现需求,该振动效果和静音模式下来电、时钟定时器的振动完全一致。
完整代码如下:
import SwiftUI import AudioToolbox // 引入音频工具箱框架 struct ContentView: View { var body: some View { VStack{ Button("Press") { // 调用系统标准振动 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) } } } }
- 如果需要实现持续重复振动(和来电时连续振动效果一致),可以添加定时器循环调用上述方法,停止振动时销毁定时器即可。
方法2:自定义振动模式
如果你需要调整振动的节奏、强度、时长,可以使用CoreHaptics框架自定义振动参数,实现完全匹配需求的效果,示例代码如下:
import SwiftUI import CoreHaptics struct ContentView: View { // 触觉引擎实例 private var hapticEngine: CHHapticEngine? init() { // 初始化触觉引擎 guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else { return } do { hapticEngine = try CHHapticEngine() try hapticEngine?.start() } catch { print("触觉引擎初始化失败: \(error.localizedDescription)") } } var body: some View { VStack{ Button("Press") { guard let engine = hapticEngine else { return } // 自定义振动参数:强度拉满,持续2秒 let event = CHHapticEvent(eventType: .hapticContinuous, parameters: [ CHHapticEventParameter(parameterID: .hapticIntensity, value: 1), CHHapticEventParameter(parameterID: .hapticSharpness, value: 0.5) ], relativeTime: 0, duration: 2) do { let pattern = try CHHapticPattern(events: [event], parameters: []) let player = try engine.makePlayer(with: pattern) try player.start(atTime: CHHapticTimeImmediate) } catch { print("振动播放失败: \(error.localizedDescription)") } } } } }
内容的提问来源于stack exchange,提问作者swiftNewb
相关产品推荐
相关产品推荐

