2016-11-07 30 views
3

通常我想要获得在我的SpriteKit游戏中强制按下图标(窥视/弹出)时产生的触觉反馈。目前我使用3D触控下列方式如何获得类似于在SpriteKit中窥视或弹出的3D触摸应用程序图标触觉反馈

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)条件满足时发生。如何才能做到这一点?

回答

2

的PEEK /流行触觉反馈可以UIPreviewInteraction在iOS的10来完成(该docs对于相当不完整的,但他们也谈论它在WWDC16 video)。这个类是在iOS的10个新的,但它只是对iPhone 6s和iPhone 7.

然而,peek/pop触觉反馈的想法是它应该绑定到一个UI,它在概念上与peek/pop相似。 (即使这是一个自定义用户界面,不能免费获得peek/pop触觉)。)Just like on Apple Watch,iPhone上的每个触觉都有其含义,当您将它们用于设计用途时,这些含义更加清晰。 (另一方面,使用UIPreviewInteraction意味着系统会自动处理触摸力与何时产生触觉之间的相关性。)

因此,如果您正在寻找更多通用触觉反馈,请在iOS 10还有一个单独的API,它提供了几种不同类型的触觉用于更广泛的场合。查看UIFeedbackGenerator的文档并使用它提供的选项,也许你会发现一个感觉适合你的游戏。

UIFeedbackGenerator需要iOS 10和iPhone 7 - 它专门用于较新设备的第二代Taptic Engine中更丰富的触觉信号词汇表,因此它在iPhone 6s上使用时无效。

+0

“因此,如果您实际上是在窥视/弹出视图控制器,那么您只能获得相同的触觉。”并非如此。 UIPreviewInteraction为您提供了这样一种回应,故事中没有视图控制器(就像它在WWDC 2016视频中告诉你的那样)。 – matt

+0

D'oh。忘了那个。 :)尽管如此,HI指南建议不要将其用于除peek/pop之外的任何内容 - 它只是与peek/pop UI分开,以便创建类似交互的自定义​​UI可以使用相同的反馈。据此编辑答案。 – rickster

+0

“尽管如此,HI指南建议不要将它用于除窥视/流行音乐之外的任何内容”这不是我理解它的方式,也不是我如何理解他们在WWDC视频中显示的内容。 – matt

1

您正在寻找UIPreviewInteraction和UIPreviewInteractionDelegate。基本上,这是一个强制触摸的手势识别器。 (为什么他们没有真的使它是一个手势识别器击败我。)我有一个基于力量触摸的“游戏”的example,其中用户使用强力触摸弹出“泡泡”。这显示了如何衡量和响应作为手势的力量。

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 

只是玩弄一切发电机和设置,看看你最适合什么。

希望这有助于

0
if touch.force > CGFloat(6.66) { 

您可能需要使用触摸。maximumPossibleForce而不是硬编码的常数:

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/

相关问题