在Swift中没有触觉反馈的情况下改变iPhone上的振动持续时间

时间:2017-11-07 14:57:37

标签: swift

我在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设置浏览通知声音时能够运行短暂的振动。

3 个答案:

答案 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).")
    }