真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

iOS中關(guān)于Taptic-Engine震動反饋的深入解析

前言

創(chuàng)新互聯(lián)專注于景德鎮(zhèn)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站建設(shè)。景德鎮(zhèn)網(wǎng)站建設(shè)公司,為景德鎮(zhèn)等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

TapticEngine是什么總的來說,TapticEngine是蘋果產(chǎn)品上推出的全新震動模塊名稱,最早出現(xiàn)在AppleWatch中,蘋果iPhone6s和iPhone6sPlus也內(nèi)置了TapticEngine,設(shè)計上有所升級。TapticEngine的全新震動模塊,這顆震動模塊經(jīng)過特殊設(shè)計,能在短時間內(nèi)達到震動的最佳狀態(tài),是普通振動馬達所做不到的。Taptic這個單詞本身沒有什么含義,比較接近的詞是Haptic(觸覺)。

TapticEngine工作原理傳統(tǒng)的手機震動器是馬達帶著偏振片一起轉(zhuǎn)動,從而產(chǎn)生震動。

大概是這個樣子滴。

iOS中關(guān)于Taptic-Engine震動反饋的深入解析

而TapticEngine是直線電機驅(qū)動帶著震塊做直線往返運動。看看下面這兩張蜜汁動感的示意圖,你就一下子就明白它是怎么產(chǎn)生震動的了。

iOS中關(guān)于Taptic-Engine震動反饋的深入解析

iPhone6s的內(nèi)置的TapticEngine

iOS中關(guān)于Taptic-Engine震動反饋的深入解析

AppleWatch的內(nèi)置的TapticEngine,左邊集成了揚聲器

Taptic Engine 振動模塊為 Apple Watch 以及 iPhone 6s、iPhone 7 提供了 Force Touch 以及 3D Touch,不同的屏幕操作,可以感受到不同的振動觸覺效果,帶來更好的用戶體驗。

What has Happened?

上周,leader 拿著 iPhone 7 打開了網(wǎng)易新聞,問我:『你看,你這里的下拉刷新是短震動,我們的手機數(shù)周遙控電視的時候只有長震動,產(chǎn)品那邊問能不能用短震動』。

然后博主就去查看了一下關(guān)于短震動的方式,整個過程可以描述為——『資料真少!』。

不過最后通過一下午的搜集,最終還是總結(jié)整理出來了這份文檔,也補充了自己對 iPhone 6s 之后對 Taptic Engine 的了解。

短震方法一 AudioServicesPlaySystemSound

常用調(diào)用:

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

以上代碼在各個型號手機中反應(yīng)為長震

API 系統(tǒng)版本支持:

__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);

APPLE 公開的 SystemSoundID 有:

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
};

以上類型 沒有短震動 。

但通過以下代碼,可以得到更多類型的震動:

// 普通短震,3D Touch 中 Peek 震動反饋
AudioServicesPlaySystemSound(1519);
// 普通短震,3D Touch 中 Pop 震動反饋
AudioServicesPlaySystemSound(1520);
// 連續(xù)三次短震
AudioServicesPlaySystemSound(1521);

但以上 ID 均未在 Apple 的 Documents 中描述。顯然,這是調(diào)用了一些私有一些屬性 。

關(guān)于是否調(diào)用了私有 API,也有一些討論,可以查看這里。

短震方法二 獲取 _tapticEngine

這種方法是從這里搜集到的。

id tapticEngine = [[UIDevice currentDevice] performSelector: NSSelectorFromString(@"_tapticEngine")
              withObject:nil];
[tapticEngine performSelector: NSSelectorFromString(@"actuateFeedback:")
      withObject:@(0)];

或者:

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];

顯然, 這是調(diào)用了私有 API 。

這些方法,在實際測試的時候發(fā)現(xiàn),在 iPhone 7 上調(diào)用沒有震動反饋,在 iPhone 6S Plus 上調(diào)用有震動反饋,在 iPhone 6 上調(diào)用 無反饋。

短震方法三 UIImpactFeedbackGenerator

iOS10 引入了一種新的、產(chǎn)生觸覺反饋的方式, 幫助用戶認(rèn)識到不同的震動反饋有不同的含義 。這個功能的核心就是由 UIFeedbackGenerator 提供。Apple 對于 UIImpactFeedbackGenerator 有一篇介紹文檔。

UIFeedbackGenerator 可以幫助你實現(xiàn) haptic feedback。它的要求是:

  • 支持 Taptic Engine 機型 (iPhone 7 以及 iPhone 7 Plus).
  • app 需要在前臺運行
  • 系統(tǒng) Haptics setting 需要開啟

Apple 曾表示公開了 Taptic Engine 的 API,但是鮮有文檔。在搜羅了各種資料后,可以認(rèn)為 UIImpactFeedbackGenerator 即 Taptic Engine 的 公開 API。

它的調(diào)用方式是:

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

Others

觀察 UIImpactFeedbackGenerator 你會發(fā)現(xiàn)它繼承于 UIFeedbackGenerator。除了 UIImpactFeedbackGenerator 還有三種 FeedbackGenerator:

  • UIImpactFeedbackGenerator
  • UISelectionFeedbackGenerator
  • UINotificationFeedbackGenerator

詳情可參考 Apple 的 這篇 Reference 。

對于震動反饋的應(yīng)用,Apple 也給出了示例場景:

- (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;
 }
}

三種方法在測試機上不同的反饋結(jié)果

AudioServicesPlaySystemSound151915201521
iPhone 7(iOS 10)peek 觸感pop 觸感三次連續(xù)短振
iPhone 6s Puls(iOS 9)peek 觸感pop 觸感三次連續(xù)短振
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)無振動無振動無振動

總結(jié)一下,希望同樣的代碼能在更多的機型上實現(xiàn)短振,建議使用 AudioServicesPlaySystemSound(1519)。不過可能會涉及到調(diào)用私有 API。安全起見,可以使用 UIImpactFeedbackGenerator。

代碼

測試代碼在這里。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。


網(wǎng)站欄目:iOS中關(guān)于Taptic-Engine震動反饋的深入解析
分享鏈接:http://weahome.cn/article/gejssi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部