主页 Taptic Engine振动反馈
Post
Cancel

Taptic Engine振动反馈

前言

Taptic Engine 是苹果产品上推出的全新震动模块,该元件最早出现在 Apple Watch 中。iPhone 6s 和 iPhone 6s Plus 中,也同样内置了Taptic Engine,在设计上有所升级。

Taptic Engine 振动模块为 Apple Watch 以及 iPhone 6s、iPhone 7 提供了 Force Touch 以及 3D Touch,不同的屏幕操作,可以感受到不同的振动触觉效果,带来更好的用户体验

触觉振动体验

振动代码(旧方案)

调用这行代码虽然可以振动 但是它属于长振动

1
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

振动代码(新方案)

iOS10 引入了一种新的、产生触觉反馈的方式, 帮助用户认识到不同的震动反馈有不同的含义 。这个功能的核心就是由 UIFeedbackGenerator 提供。

UIFeedbackGenerator 可以帮助你实现 haptic feedback。它的要求是:

  • 支持 Taptic Engine 机型 (iPhone 7 以及 iPhone 7 Plus).
  • app 需要在前台运行
  • 系统 Taptic setting 需要开启

下图开启 声音与触感 手机 – 设置 – 声音与触感 – 系统触感反馈(打开)

调用相关振动代码实现振动功能

UIFeedbackGenerator 子类有:

  • UIImpactFeedbackGenerator
  • UISelectionFeedbackGenerator
  • UINotificationFeedbackGenerator

UIImpactFeedbackGenerator振动

1
2
UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle: UIImpactFeedbackStyleLight];
[generator impactOccurred];

振动style有三种枚举

1
2
3
4
5
6
typedef NS_ENUM(NSInteger, UIImpactFeedbackStyle) {
    UIImpactFeedbackStyleLight,
    UIImpactFeedbackStyleMedium,
    UIImpactFeedbackStyleHeavy
};

基本每次振动相当于创建一个实例调用一次方法就行了,如果觉得性能更好的设计可以搞成成员变量

反馈结果

UIImpactFeedbackGeneratorUIImpactFeedbackStyleLightUIImpactFeedbackStyleMediumUIImpactFeedbackStyleHeavy
iPhone 7(iOS 10)及以上机型微弱短振中等短振明显短振
iPhone 6s Puls(iOS 9)长振长振长振
iPhone 6(iOS 10)无振动无振动无振动

UISelectionFeedbackGenerator振动

这里我试图搞成成员变量模拟手势拖拽 振动

1
2
@property (nonatomic, strong) UISelectionFeedbackGenerator *feedbackGesGenerator;

事件相应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
- (IBAction)gestrueHandle:(UIGestureRecognizer *)sender {
    switch (sender.state) {
        case UIGestureRecognizerStateBegan:
            
            // Instantiate a new generator.
            self.feedbackGesGenerator = [[UISelectionFeedbackGenerator alloc] init];
            
            // Prepare the generator when the gesture begins.
            [self.feedbackGesGenerator prepare];
            
            break;
            
        case UIGestureRecognizerStateChanged: {
            
            // Check to see if the selection has changed...
           
                // Trigger selection feedback.
                [self.feedbackGesGenerator selectionChanged];
                
                // Keep the generator in a prepared state.
                [self.feedbackGesGenerator prepare];
            
            }
            
            break;
            
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateFailed:
            
            // Release the current generator.
            self.feedbackGesGenerator = nil;
            
            break;
            
        default:
            
            // Do nothing.
            break;
    }
}

注意: __这里调用了一下[self.feedbackGesGenerator prepare]方法让振动引擎准备就绪,方便下次快速启动__这个方法是父类的方法

UINotificationFeedbackGenerator振动

1
2
3
UINotificationFeedbackGenerator *notifiFeedBack = [[UINotificationFeedbackGenerator alloc] init];
    [notifiFeedBack notificationOccurred:UINotificationFeedbackTypeWarning];

同样UINotificationFeedbackType也是三种枚举

1
2
3
4
5
typedef NS_ENUM(NSInteger, UINotificationFeedbackType) {
    UINotificationFeedbackTypeSuccess,
    UINotificationFeedbackTypeWarning,
    UINotificationFeedbackTypeError
};

总结

几种不同的振动API 可以视情况而使用, 比较常用的是 UIImpactFeedbackGenerator, 当然也可以随意使用注意操作系统判断检查。

例如:

1
2
3
if (@available(iOS 10.0, *)) {
	//写相关振动代码
}

全文完

该博客文章由作者通过 CC BY 4.0 进行授权。

利用UIToolBar做高斯模糊背景

iOS中CPU线程调试高级技巧