服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS中关于Taptic-Engine震动反馈的深入解析

iOS中关于Taptic-Engine震动反馈的深入解析

2021-04-06 15:12小鱼周凌宇 IOS

这篇文章主要给大家介绍了关于iOS中关于Taptic-Engine震动反馈的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

tapticengine是什么总的来说,tapticengine是苹果产品上推出的全新震动模块名称,最早出现在applewatch中,苹果iphone6s和iphone6splus也内置了tapticengine,设计上有所升级。tapticengine的全新震动模块,这颗震动模块经过特殊设计,能在短时间内达到震动的最佳状态,是普通振动马达所做不到的。taptic这个单词本身没有什么含义,比较接近的词是haptic(触觉)。

tapticengine工作原理传统的手机震动器是马达带着偏振片一起转动,从而产生震动。

大概是这个样子滴。

iOS中关于Taptic-Engine震动反馈的深入解析

而tapticengine是直线电机驱动带着震块做直线往返运动。看看下面这两张蜜汁动感的示意图,你就一下子就明白它是怎么产生震动的了。

iOS中关于Taptic-Engine震动反馈的深入解析

iphone6s的内置的tapticengine

iOS中关于Taptic-Engine震动反馈的深入解析

applewatch的内置的tapticengine,左边集成了扬声器

taptic engine 振动模块为 apple watch 以及 iphone 6s、iphone 7 提供了 force touch 以及 3d touch,不同的屏幕操作,可以感受到不同的振动触觉效果,带来更好的用户体验。

what has happened?

上周,leader 拿着 iphone 7 打开了网易新闻,问我:『你看,你这里的下拉刷新是短震动,我们的手机数周遥控电视的时候只有长震动,产品那边问能不能用短震动』。

然后博主就去查看了一下关于短震动的方式,整个过程可以描述为——『资料真少!』。

不过最后通过一下午的搜集,最终还是总结整理出来了这份文档,也补充了自己对 iphone 6s 之后对 taptic engine 的了解。

短震方法一 audioservicesplaysystemsound

常用调用:

?
1
audioservicesplaysystemsound(ksystemsoundid_vibrate);

以上代码在各个型号手机中反应为长震

api 系统版本支持:

?
1
__osx_available_starting(__mac_10_5,__iphone_2_0);

apple 公开的 systemsoundid 有:

?
1
2
3
4
5
6
7
8
9
10
11
12
cf_enum(systemsoundid)
{
 ksystemsoundid_userpreferredalert = 0x00001000,
 ksystemsoundid_flashscreen   = 0x00000ffe,
  // this has been renamed to be consistent
 kuserpreferredalert  = ksystemsoundid_userpreferredalert
};
 
cf_enum(systemsoundid)
{
 ksystemsoundid_vibrate    = 0x00000fff
};

以上类型 没有短震动 。

但通过以下代码,可以得到更多类型的震动:

?
1
2
// 普通短震,3d touch 中 peek 震动反馈
audioservicesplaysystemsound(1519);
?
1
2
// 普通短震,3d touch 中 pop 震动反馈
audioservicesplaysystemsound(1520);
?
1
2
// 连续三次短震
audioservicesplaysystemsound(1521);

但以上 id 均未在 apple 的 documents 中描述。显然,这是调用了一些私有一些属性 。

关于是否调用了私有 api,也有一些讨论,可以查看这里

短震方法二 获取 _tapticengine

这种方法是从这里搜集到的。

?
1
2
3
4
id tapticengine = [[uidevice currentdevice] performselector: nsselectorfromstring(@"_tapticengine")
              withobject:nil];
[tapticengine performselector: nsselectorfromstring(@"actuatefeedback:")
      withobject:@(0)];

或者:

?
1
2
3
4
5
6
7
8
9
10
11
id tapticengine = [[uidevice currentdevice] performselector: nsselectorfromstring(@"_tapticengine")
              withobject:nil];
 
sel selector = nsselectorfromstring(@"actuatefeedback:");
int32_t arg = 1001;
 
nsinvocation *inv = [nsinvocation invocationwithmethodsignature:[tapticengine methodsignatureforselector:selector]];
[inv settarget:tapticengine];
[inv setselector:selector];
[inv setargument:&arg atindex:2];
[inv invoke];

显然, 这是调用了私有 api 。

这些方法,在实际测试的时候发现,在 iphone 7 上调用没有震动反馈,在 iphone 6s plus 上调用有震动反馈,在 iphone 6 上调用 无反馈。

短震方法三 uiimpactfeedbackgenerator

ios10 引入了一种新的、产生触觉反馈的方式, 帮助用户认识到不同的震动反馈有不同的含义 。这个功能的核心就是由 uifeedbackgenerator 提供。apple 对于 uiimpactfeedbackgenerator 有一篇介绍文档

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

  • 支持 taptic engine 机型 (iphone 7 以及 iphone 7 plus).
  • app 需要在前台运行
  • 系统 haptics setting 需要开启

apple 曾表示公开了 taptic engine 的 api,但是鲜有文档。在搜罗了各种资料后,可以认为 uiimpactfeedbackgenerator 即 taptic engine 的 公开 api。

它的调用方式是:

?
1
2
3
uiimpactfeedbackgenerator *generator = [[uiimpactfeedbackgenerator alloc] initwithstyle: uiimpactfeedbackstylelight];
[generator prepare];
[generator impactoccurred];

others

观察 uiimpactfeedbackgenerator 你会发现它继承于 uifeedbackgenerator。除了 uiimpactfeedbackgenerator 还有三种 feedbackgenerator:

  • uiimpactfeedbackgenerator
  • uiselectionfeedbackgenerator
  • uinotificationfeedbackgenerator

详情可参考 apple 的 这篇 reference

对于震动反馈的应用,apple 也给出了示例场景:

?
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
42
43
- (ibaction)gesturehandler:(uipangesturerecognizer *)sender {
 
 switch (sender.state) {
  case uigesturerecognizerstatebegan:
   
   // instantiate a new generator.
   self.feedbackgenerator = [[uiselectionfeedbackgenerator alloc] init];
   
   // prepare the generator when the gesture begins.
   [self.feedbackgenerator prepare];
   
   break;
   
  case uigesturerecognizerstatechanged:
   
   // check to see if the selection has changed...
   if ([self mycustomhasselectionchangedmethodwithtranslation:[sender translationinview: self.view]]) {
    
    // trigger selection feedback.
    [self.feedbackgenerator selectionchanged];
    
    // keep the generator in a prepared state.
    [self.feedbackgenerator prepare];
 
   }
   
   break;
   
  case uigesturerecognizerstatecancelled:
  case uigesturerecognizerstateended:
  case uigesturerecognizerstatefailed:
   
   // release the current generator.
   self.feedbackgenerator = nil;
   
   break;
   
  default:
   
   // do nothing.
   break;
 }
}

三种方法在测试机上不同的反馈结果

 

audioservicesplaysystemsound 1519 1520 1521
iphone 7(ios 10) peek 触感 pop 触感 三次连续短振
iphone 6s puls(ios 9) peek 触感 pop 触感 三次连续短振
iphone 6(ios 10) 无振动 无振动 无振动

 

获取 _tapticengine 

 

iphone 7(ios 10) 无振动
iphone 6s puls(ios 9) 长振
iphone 6(ios 10) 无振动

 

 

uiimpactfeedbackgenerator .light .medium .heavy
iphone 7(ios 10) 微弱短振 中等短振 明显短振
iphone 6s puls(ios 9) 长振 长振 长振
iphone 6(ios 10) 无振动 无振动 无振动

 

总结一下,希望同样的代码能在更多的机型上实现短振,建议使用 audioservicesplaysystemsound(1519)。不过可能会涉及到调用私有 api。安全起见,可以使用 uiimpactfeedbackgenerator。

代码

测试代码在这里

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://zhoulingyu.com/2017/01/16/iOS——关于-Taptic-Engine-震动反馈/

延伸 · 阅读

精彩推荐
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01