如何在SpriteKit中实现与Peek或Pop类似的3D Touch应用程序图标触感反馈。

4

通常我想在我的SpriteKit游戏中获取当图标被强制按下(peek/pop)时产生的触觉反馈。目前我是这样使用3D Touch的

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        if touch.force > CGFloat(6.66) {
        shootOut ()
        }
    }
}

当满足if touch.force > CGFloat(6.66)条件时,我希望有触觉反馈(类似于“峰值”或“弹出”)。如何实现这一点?

4个回答

2
在iOS 10中,可以使用UIPreviewInteraction实现peek/pop触觉反馈。(关于此的WWDC16视频文档都比较简略。)这个类在iOS 10中是新的,但适用于iPhone 6s和iPhone 7。
然而,peek/pop触觉反馈的想法是它应该与概念上类似于peek/pop的UI相关联。(即使这是一个不能免费获得peek/pop触觉的自定义UI。)就像在Apple Watch上一样,iPhone上的每个触觉都有意义,当你将它们用于它们设计的目的时,这些意义更加清晰。(另一方面,使用UIPreviewInteraction意味着系统自动处理了触摸力度和何时产生触觉之间的关联。)
因此,如果您正在寻找更通用的触觉反馈,在iOS 10中还有一个单独的API,为各种情况提供几种不同类型的触觉反馈。请查看UIFeedbackGenerator的文档,并尝试使用它提供的选项,也许您会找到一个适合您的游戏的触觉反馈。 UIFeedbackGenerator需要iOS 10和iPhone 7-它专门用于新设备第二代Taptic Engine提供的更丰富的触觉信号词汇表,因此在iPhone 6s上使用时没有效果。

并非如此。UIPreviewInteraction可以在没有视图控制器的情况下提供这种响应(这也是它的重点,正如他们在WWDC 2016关于此主题的视频中所告诉你的那样)。因此,您只有在实际上查看/弹出视图控制器时才会获得相同的触觉反馈。 - matt
哎呀,忘记了那个。:) 尽管如此,HI指南建议不要将其用于除peek/pop之外的任何内容 - 它只是与peek/pop UI分开,以便创建类似交互的自定义UI可以使用相同的反馈。已相应地编辑答案。 - rickster
然而,HI指南建议不要将其用于除了peek/pop之外的任何事情。这不是我的理解方式,也不是我对WWDC视频所展示内容的理解方式。 - matt

1
你正在寻找 UIPreviewInteraction 和 UIPreviewInteractionDelegate。基本上,它是一个用于力触的手势识别器。(为什么他们没有实际制作一个手势识别器让我感到困惑。)我有一个基于力触的“游戏”example的示例,在该示例中用户使用力触弹出“气泡”。这展示了如何将力度作为手势进行测量和响应。

1
if touch.force > CGFloat(6.66) {

回复内容存在敏感词^**$PossibleForce 而不是硬编码的常数:
touch.force / touch.maximumPossibleForce

检查一下是否支持力触可能是个好主意:

if(is3dTouchAvailable(traitCollection: self.view!.traitCollection)) {
   //...
}

更多细节和代码示例 http://www.mikitamanko.com/blog/2017/02/01/swift-how-to-use-3d-touch-introduction/

至于与图标力触相同的“效果”,在这里:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.prepare()

generator.impactOccurred()

请查看有关触觉反馈的检查支持和回退的详细信息: http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/

0
要在您的游戏中获得触觉反馈,您可以使用以下内容:
UIImpactFeedbackGenerator UINotificationFeedbackGenerator UISelectionFeedbackGenerator

e.g

// Impact 
let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
generator.prepare() // prepare for next time, should ideally call this before playing first time as well

// Selection
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
generator.prepare() // prepare for next time, should ideally call this before playing first time as well

// Notification
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.warning)
generator.prepare() // prepare for next time, should ideally call this before playing first time as well

尝试使用所有的生成器和设置,找到最适合您的。

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接