對(duì)iOS震動(dòng)反饋的研究

最近真的是好久沒有寫簡書了, 期間有無數(shù)次沖動(dòng)想認(rèn)真寫一篇, 可是總擠不出整塊的時(shí)間來寫. 還有一個(gè)原因就是總覺得如果寫不出一篇好的技術(shù)文章, 寧可就不寫.
最近在查資料的時(shí)候, 被那種賦值粘貼的文章惡心的夠嗆??


最近老板熱衷于在項(xiàng)目添加各種音效, 今天跟我說讓我在下拉刷新的時(shí)候加一個(gè)震動(dòng), 第一時(shí)間我就想到了AudioServicesPlayAlertSound(<#SystemSoundID inSystemSoundID#>)這個(gè)方法, 運(yùn)行項(xiàng)目后我的手簡直都要被震麻了. 這個(gè)方法有兩個(gè)弊端, 一是無法控制震動(dòng)時(shí)間, 二是無法控制震動(dòng)力度, 用在反饋上面實(shí)在是有些過于沉重. 所以研究了兩個(gè)比較好用的短震動(dòng)反饋

1.AudioServicesPlaySystemSound

通過以下代碼可以得到更多類型的震動(dòng)

//短震  3D Touch中的peek震動(dòng)反饋
AudioServicesPlaySystemSound(1519);
//短震  3D Touch中的pop震動(dòng)反饋
AudioServicesPlaySystemSound(1520);
//連續(xù)三次短震動(dòng)
AudioServicesPlaySystemSound(1521);

用白話來說就是peek的震動(dòng)反饋輕于pop, 詳細(xì)區(qū)別可以看Apple Developer的這篇文章

其實(shí)上面三種已經(jīng)可以應(yīng)對(duì)大部分的震動(dòng)反饋需求了, 如果需要精度更高的, 請(qǐng)看下面這個(gè)方法.

2.UIImpactFeedbackGenerator

UIImpactFeedbackGenerator是iOS10推出的一個(gè)類, 幫助用戶認(rèn)識(shí)到不同的震動(dòng)反饋有不同的含義. Appled對(duì)UIImpactFeedbackGenerator一篇介紹文檔. 當(dāng)然在Xcode中(Command + Shift + 0)調(diào)取官方文檔查看也是很方便的.

調(diào)用方式:
UIImpactFeedbackGenerator *impactFeedBack = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight];
[impactFeedBack prepare];
[impactFeedBack impactOccurred];

這個(gè)prepare方法是可選的, 但是Apple強(qiáng)烈建議使用此方法. 調(diào)用此方法有助于確保您的反饋具有盡可能低的延遲.

Note
The prepare method is optional; however, it is highly recommended. Calling this method helps ensure that your feedback has the lowest possible latency.

枚舉值:
typedef NS_ENUM(NSInteger, UIImpactFeedbackStyle) {
    UIImpactFeedbackStyleLight,
    UIImpactFeedbackStyleMedium,
    UIImpactFeedbackStyleHeavy
};

上面三個(gè)枚舉值在初始化對(duì)象的時(shí)候使用, 對(duì)應(yīng)不同的反饋力度, 這個(gè)比較好理解. (順便一提UIImpactFeedbackStyleLight模式真的很輕柔)

使用場景:

對(duì)于震動(dòng)反饋的應(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;
    }
}
  • 一般用于下拉刷新
  • 手勢反饋 (微信全屏查看圖片時(shí), 縮小手勢結(jié)束后, 就會(huì)有一個(gè)震動(dòng)反饋)
  • ...
    雖然震動(dòng)反饋對(duì)提升用戶體驗(yàn)幫助很大, 但是也不能濫用
使用要求:

是不是覺得UIImpactFeedbackGenerator很好用, 就可以在項(xiàng)目中引入了, 其實(shí)UIImpactFeedbackGenerator限制性還是很高的. 使用它需要滿足以下幾個(gè)前提:

  • App需要在前臺(tái)運(yùn)行
  • 僅支持Taptic Engine機(jī)型 (iPhone7及以上機(jī)型)
UIImpactFeedbackGenerator Light Medium Heavy
iPhone 7(iOS 11) 微弱短振 中等短振 明顯短振
iPhone 6s Puls(iOS 9) 長振 長振 長振
iPhone 6(iOS 10) 無振動(dòng) 無振動(dòng) 無振動(dòng)
  • 僅支持iPhone OS >= 10.0
UIKIT_CLASS_AVAILABLE_IOS_ONLY(10_0) @interface UIFeedbackGenerator : NSObject

如果項(xiàng)目支持10.0以下版本, 需要進(jìn)行版本判斷

 if (@available(iOS 10.0, *)) {
        //use feedBack
    } else {
        // Fallback on earlier versions
    }
  • 設(shè)置 -> 聲音與觸感 -> 系統(tǒng)觸感反饋打開switch開關(guān)
    系統(tǒng)觸感反饋

綜上所述, 如為適配更多版本和更多型號(hào)的機(jī)型, 建議使用AudioServicesPlaySystemSound(1519);, 我很喜歡它的英文名peek, 它的反饋很形象的描述出了輕輕一瞥的感覺.
但是如果需求是可使用自定義強(qiáng)度的反饋, 而且可以被用戶關(guān)閉掉, 建議還是使用UIImpactFeedbackGenerator

參考:

很厲害的程序媛博客, 寫的很詳細(xì), 文章都不錯(cuò)


就用王小姐雙十一送我的鼠標(biāo)來結(jié)尾把
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末难审,一起剝皮案震驚了整個(gè)濱河市啸盏,隨后出現(xiàn)的幾起案子祭陷,更是在濱河造成了極大的恐慌溉浙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡傻盟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門嫂丙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人规哲,你說我怎么就攤上這事跟啤。” “怎么了唉锌?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵隅肥,是天一觀的道長。 經(jīng)常有香客問我袄简,道長腥放,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任绿语,我火速辦了婚禮秃症,結(jié)果婚禮上候址,老公的妹妹穿的比我還像新娘。我一直安慰自己种柑,他們只是感情好岗仑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聚请,像睡著了一般荠雕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驶赏,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天炸卑,我揣著相機(jī)與錄音,去河邊找鬼煤傍。 笑死盖文,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的患久。 我是一名探鬼主播椅寺,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒋失!你這毒婦竟也來了返帕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤篙挽,失蹤者是張志新(化名)和其女友劉穎荆萤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铣卡,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡链韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了煮落。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敞峭。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝉仇,靈堂內(nèi)的尸體忽然破棺而出旋讹,到底是詐尸還是另有隱情,我是刑警寧澤轿衔,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布沉迹,位于F島的核電站,受9級(jí)特大地震影響害驹,放射性物質(zhì)發(fā)生泄漏鞭呕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一宛官、第九天 我趴在偏房一處隱蔽的房頂上張望葫松。 院中可真熱鬧瓦糕,春花似錦、人聲如沸进宝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽党晋。三九已至谭胚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間未玻,已是汗流浹背灾而。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扳剿,地道東北人旁趟。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像庇绽,于是被迫代替她去往敵國和親锡搜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • 我為什么要寫瞧掺?這個(gè)問題向來苦澀耕餐。因?yàn)槟壳盀橹沟淖约簝?nèi)心深處始終尋求不到讓我心安的答復(fù)。 高興時(shí)辟狈、難...
    淺淺心情淡淡墨跡閱讀 172評(píng)論 0 0
  • 愛情對(duì)有的人來說很陌生肠缔,對(duì)有的人來說他們似乎很了解,但其實(shí)真正懂它的人很少哼转,也很難去做到擁有明未。 它在情侶之間的手牽...
    VanBecks閱讀 308評(píng)論 0 1
  • 前段時(shí)間和朋友一起去看了動(dòng)畫《聲之形》的劇場版。整個(gè)電影看下來感觸還是比較深的壹蔓,我非常喜歡其悠揚(yáng)的配樂趟妥,而我一起去...
    陳瀛Neptune閱讀 1,116評(píng)論 26 31
  • 發(fā)燒迷迷糊糊的時(shí)候媽就一直在我身邊說話,她嘮叨我不會(huì)照顧自己佣蓉,嘮叨寇先生也不可靠一點(diǎn)也照顧不好人……她就差把我拎起...
    蔻濰稱閱讀 406評(píng)論 0 0