最近真的是好久沒有寫簡書了, 期間有無數(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)
綜上所述, 如為適配更多版本和更多型號(hào)的機(jī)型, 建議使用
AudioServicesPlaySystemSound(1519);
, 我很喜歡它的英文名peek, 它的反饋很形象的描述出了輕輕一瞥的感覺.
但是如果需求是可使用自定義強(qiáng)度的反饋, 而且可以被用戶關(guān)閉掉, 建議還是使用UIImpactFeedbackGenerator
參考:
很厲害的程序媛博客, 寫的很詳細(xì), 文章都不錯(cuò)