東引甌越

不断学习, 与时俱进.

嗨,我是孙亚洲(@sunyazhou13),一名来自北国冰城的iOS开发者,也搞过一些mac.现居帝都北京.开发数年有余,没有为往圣续绝学深感惭愧,始于2016.望诸位同仁多多指教.


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,不同的屏幕操作,可以感受到不同的振动触觉效果,带来更好的用户体验

触觉振动体验

振动代码(旧方案)

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

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

振动代码(新方案)

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

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

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

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

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

UIFeedbackGenerator 子类有:

  • UIImpactFeedbackGenerator
  • UISelectionFeedbackGenerator
  • UINotificationFeedbackGenerator

UIImpactFeedbackGenerator振动

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

振动style有三种枚举

typedef NS_ENUM(NSInteger, UIImpactFeedbackStyle) {
UIImpactFeedbackStyleLight,
UIImpactFeedbackStyleMedium,
UIImpactFeedbackStyleHeavy
};

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

反馈结果

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

UISelectionFeedbackGenerator振动

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

@property (nonatomic, strong) UISelectionFeedbackGenerator *feedbackGesGenerator;

事件相应

- (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振动

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

同样UINotificationFeedbackType也是三种枚举

typedef NS_ENUM(NSInteger, UINotificationFeedbackType) {
UINotificationFeedbackTypeSuccess,
UINotificationFeedbackTypeWarning,
UINotificationFeedbackTypeError
};

总结

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

例如:

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

全文完

最近的文章

iOS中CPU线程调试高级技巧

前言最近在开发直播,发现CPU性能被打满后导致CPU降频,发热严重,然后卡顿… 为了定位这个问题我们花费了至少 3天的时间 一点一点跟踪CPU的线程代码,当遇到C++的thread的时候没有符号表,只能看见一坨对象地址,除此以外连个方法名都没有的时候真是手足无措.本篇介绍一个高级调试 方法,使用符号 …

于  iOS开发, macOS开发 继续阅读
更早的文章

利用UIToolBar做高斯模糊背景

- (UIView *)containerBackgroundView { if (!_containerBackgroundView) { UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRe …

于  iOS开发, macOS开发 继续阅读