Fork me on GitHub

使用 UIFeedbackGenerator 来实现触觉反馈

写在前面

Tips:触觉反馈的特性从 iOS 10 开始支持,并且需要iPhone 7 和 iPhone 7 Plus 内置的新 Taptic 引擎支持这些应用程序接口(API)。

最近在使用饿了么定外卖的时候,偶然感觉到饿了么下拉刷新有个震动。起初我并不知道这个是触觉反馈,后来我发现包括调用 Apple Pay 支付的时候,成功和失败都回引起触觉反馈。

系统触感强度设置 饿了么刷新触觉反馈 Apple Pay 支付成功和失败触觉反馈

触觉反馈

iOS 10 引入了一种新的产生触觉反馈的方式,通过使用系统的预定义震动模式,让用户在进行操作时得到不同的震动反馈。这个功能有新增的 UIFeedbackGenerator 提供,根据官方的文档

The abstract superclass for all feedback generators.

该类为一个抽象类,提供三个子类 UIImpactFeedbackGeneratorUISelectionFeedbackGeneratorUINotificationFeedbackGenerator

UIImpactFeedbackGenerator

Use impact feedback generators to indicate that an impact has occurred.

预示着按压发生了。比如系统触感强度设置就是为了在你按 Home 键的时候给你一反馈,实际上 iPhone 7 的 Home 键并可以按动。

UIImpactFeedbackStyle 一共是三种:.light.mediumheavy,分别对应了系统触感强度里面的 1、2、3。

UISelectionFeedbackGenerator

Use selection feedback generators to indicate a change in selection.

预示着选择的变化。比如饿了么的刷新触觉反馈,这里普及一下,这种刷新反馈是因为饿了么使用的系统的 UIRefreshControl 方法去做的下拉刷新,而系统为这种方法下拉的 offsetY 做了触觉反馈的适配。

UINotificationFeedbackGenerator

Use notification feedback generators to indicate successes, failures, and warnings.

预示着成功、失败和警告。比如 Apple_Pay 支付成功和失败的反馈,这里比较了下三种情况的反馈,应该是在力度上面有所差别。和 Impact 的差别在于,这里的触觉反馈类似左右摇动两下。

UINotificationFeedbackType 同样也是三种:.success.warningerror

用法

最后讲一下用法,掘金的翻译计划 [译] 如何使用 UIFeedbackGenerator 让应用支持 iOS 10 的触觉反馈 中,给出了一个 Demo。注意 Demo 中有个问题,addsubview 应该在添加约束之前,否则会引起崩溃。

不过根据官方的文档,触发触觉效果之前,在你的生成器 (generator) 内调用 prepare() 方法,这样可以有效的减少延迟。可以参考官方文档中的代码,也可以参考如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var feedbackGenerator : UIImpactFeedbackGenerator? = UIImpactFeedbackGenerator(style: .heavy)
deinit {
feedbackGenerator = nil
}
override func viewDidLoad() {
super.viewDidLoad()
feedbackGenerator?.prepare()
}
@IBAction func getNewGank(_ sender: UIBarButtonItem) {
feedbackGenerator?.impactOccurred()
}

版权声明



Ivan’s Blog by Ivan Ye is licensed under a Creative Commons BY-NC-ND 4.0 International License.
叶帆创作并维护的叶帆的博客博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Ivan’s Blog | 叶帆的博客博客( http://yeziahehe.com ),版权所有,侵权必究。

本文链接:http://yeziahehe.com/2017/07/07/Haptic_feedback_with_uifeedbackgenerator/