我在Swift中创建一个简单的游戏。如果时间差不多(5秒钟),我想振动手机。
当还剩5或4秒时:每秒振动一次AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)。
问题1:
当还剩3或2秒时:短暂振动,每秒两次。 当1秒左右,短暂振动,每秒三次。
问题2:
当剩下0秒时,振动2或3秒。
这可能吗?如何更改振动的持续时间?我在网上看到,不允许增加振动的持续时间,这对我来说很好,但我可以缩短持续时间吗?
我已经检查了How to make iPhone vibrate using Swift?,但是2014年的这个问题没有涵盖Swift 3或4.如果我尝试播放1519,1520或1521的声音,它什么都不做。 Malmer发布的答案仅针对iPhone的触觉反馈。我想为iPhone 6s及更低版本找到解决方案,因为它们仍然运行最新的iOS(11),并且当您通过iOS设置浏览通知声音时能够运行短暂的振动。
答案 0 :(得分:2)
在振动设备方面,可能性非常有限。据我所知,这是唯一可用的方法(如果你需要支持所有iPhone):
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
从docs:“功能调用短暂的振动。在iPod touch上,什么都不做。”。
您必须创建som逻辑才能重复此操作。一种解决方案可能是使用NSTimer API。例如。 scheduledTimerWithTimeInterval
。
示例实施:
var gameTimer: Timer!
// Execute doTimedStuff method every 2 seconds
gameTimer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(doTimedStuff), userInfo: nil, repeats: true)
// Invalidate timer when done
gameTimer.invalidate()
答案 1 :(得分:0)
一种选择是使用let feedbackGenerator = UISelectionFeedbackGenerator()
feedbackGenerator.prepare()
feedbackGenerator.selectionChanged()
来产生触觉反馈。 Documentation Link
这使您可以从一些预先设定的触觉振动中进行选择,您可以按照所需的时间间隔进行射击。
以下是一个简单的示例,但请务必访问上面链接的文档,了解所有触觉反馈选项和最佳做法。
listView.setChoiceMode(int mode)
(请注意,这仅适用于iPhone 7和更新的设备。)
答案 2 :(得分:0)
对CHHapticEvent使用.hapticContinuous事件类型。您可以自定义振动时间和振动强度。
let intensity = CHHapticEventParameter(parameterID: .hapticIntensity, value: 1.0)
let sharpness = CHHapticEventParameter(parameterID: .hapticSharpness, value: 0.5)
var events = [CHHapticEvent]()
var relativeTimer = 0.0
let event1 = CHHapticEvent(eventType: .hapticContinuous, parameters: [intensity, sharpness], relativeTime: relativeTimer, duration: longDuration)
relativeTimer += event1.duration
events.append(event1)
do {
let pattern = try CHHapticPattern(events: events, parameters: [])
let player = try engine.makePlayer(with: pattern)
try engine.start()
try player.start(atTime: 0)
} catch {
print("Haptic Error: \(error.localizedDescription).")
}