使用UIFeedbackGenerator的触觉反馈和Taptic Engine改善iOS应用程序用户体验


在我的上一篇文章中,我写了关于在任何UIView中引入3D Touch作为通用UIGestureRecognizer来改善与您的应用程序的交互的信息,现在我想探索触觉反馈,这为我们提供了一种新的物理方式来控制用户所发生的事情在他的iPhone上。
在通过Taptic引擎提供触觉反馈之前,播放声音是向用户提供有关应用程序中动作的反馈的唯一方法,但是声音令人讨厌,有时令人毛骨悚然。

UIKit为此提供了一种简洁明了的方法:用于触觉反馈即插即用实现的标准安全接口UIFeedbackGenerator。


在特定的UIFeedbackGenerator中,是一个我们不能直接使用的抽象超类,我们必须在3个具体的子类中进行选择,每个子类都有特定的使用目的地。

UISelectionFeedbackGenerator

当用户通过一系列离散值更改选择时,例如在Apple通过诸如UIDatePicker之类的选择器移动Apple时,提供此反馈。
在实现自定义分段控件或更改任何选择时,可以在多个选择表视图和集合视图上使用它。

UIImpactFeedbackGenerator

该反馈旨在用于模拟Taptic引擎的物理影响。
UI元素固定到位或某些元素碰撞时,请使用它。
它具有3个强度级别,您必须将其作为初始参数传递:轻,中和重。 Apple建议根据UI元素大小选择强度。
我还在自定义3D触摸手势识别器(在GitHub和我的Medium帖子中)中使用它,以中等风格提供有关成功手势的反馈。

UINotificationFeedbackGenerator

这是最完整的反馈生成器。 您应该使用它来传达任务或动作的结果。
与ImpactFeedback相似,它接受一个参数,但是这次不是init方法,而是运行Feeedback时。 这次的样式与强度无关,而是指通知操作的结果:成功,警告或错误。 选择一个表示用户已结束操作的结果。

UIFeedbackGenerator非常容易集成到您的应用程序中。
自iOS 10起可用,除非您支持以前的iOS版本,否则不必检查可用性,否则:

  如果 #availableiOS 10,*){ 
// UIFeedbackGenerator代码块
}

或更快捷的方式:

  Guard #availableiOS 10,*) else { 
返回
}
// UIFeedbackGenerator代码块
  • 现在,您可以初始化从3个可用类中选择的具体类,并确保选择一个适合用户操作的类。
 让feedbackGenerator = UISelectionFeedbackGenerator.init() 
//要么
让feedbackGenerator = UIImpactFeedbackGenerator(style:.medium)
//要么
让feedbackGenerator = UINotificationFeedbackGenerator()
  • 建议将feedbackGenerator初始化后,但不是必须的,以准备Taptic Engine。 当您准备好引擎时,它会保持准备状态仅几秒钟,因此请不要太早准备它。 如果您要保持热情并以声音或视觉效果进行同步,则准备好的反馈的发布将更加高效和响应。
    在Apple文档上找到有关准备方法的更多信息。
  feedbackGenerator.prepare() 
  • 现在我们可以触发反馈了。
    请注意,每个具体子类的签名都会更改:
  // UISelectionFeedbackGenerator 
feedbackGenerator.selectionChanged()// UIImpactFeedbackGenerator
feedbackGenerator.impactOccurred()// UINotificationFeedbackGenerator
feedbackGenerator.notificationOccurred(.success)
  • (可选)从代码中删除对反馈生成器的任何引用,或者将全局或局部变量设置为nil 。 此步骤将使Taptic Engine进入空闲状态,并将其释放以用于其他用途。
  feedbackGenerator =无 

UIFeedbackGenerator可以安全实现。 您只需要在iOS 10+上安装它,一切就由iOS处理。
如果您在不支持触觉反馈的设备上使用它(因为它是旧设备或在系统偏好设置中禁用了该选项),则您无需执行任何操作,只是它不起作用但不会破坏您的应用程式。

  • 苹果文档
  • GitHub上的示例项目