閒來無事,分享一個妹子使用利器,shakeTool
感覺汙汙的,記得在大學時候用安卓手機的時候見過類似的app,簡單寫了一個demo,喜歡的朋友歡迎分享轉發。
我們先來看一下效果圖
功能很簡單,分為三種:
-
1.體驗單次:故名思議,就是體驗一下震動的趕腳
-
2.持續:不停的震動,哈哈
-
3.關閉:停止振動棒工作
下邊的滑塊是自己寫的slider
,估計是系統的slider
太醜,而且滑動不靈敏。
demo已經上傳到github,可以下載安裝,記得真機執行
下載demo
接下來簡單說一下實現思路:
1.震動來源,匯入AudioToolbox
庫
#import <AudioToolbox/AudioToolbox.h>
複製程式碼
這裡我們使用的類均來自於AudioServices
的方法
2.如果你喜歡特變的震動背景樂,可以通過下邊實現
NSString *path = [[NSBundle mainBundle] pathForResource:@"1669" ofType:@"wav"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &sound);
AudioServicesAddSystemSoundCompletion(sound, NULL, NULL, soundCompleteCallback, NULL);
AudioServicesPlaySystemSound(sound);
複製程式碼
3.實現震動效果
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
複製程式碼
這裡kSystemSoundID_Vibrate
即service
中的震動效果
4.因為要實現持續震動,所以需要建立全域性的NSTimer
來控制開始,暫停。
_vibrationTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(playkSystemSound) userInfo:nil repeats:YES];
複製程式碼
5.例項的時候需要暫停定時器的運轉
[_vibrationTimer setFireDate:[NSDate distantFuture]];
複製程式碼
在恰當的實際可以重新開啟震動效果
[_vibrationTimer setFireDate:[NSDate distantPast]];
複製程式碼
6.滑動滑塊的時候我們要控制震動的節奏
新增一個UIImageView
和一個Button
,按鈕新增滑動手勢
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(progreeChanged:)];
[self.progressBtn addGestureRecognizer:pan];
複製程式碼
7.實現滑動過程中調整滑塊位置,並調整震動節奏
-(void)progreeChanged:(UIPanGestureRecognizer *)recognizer{
// Figure out where the user is trying to drag the view.
CGPoint translation = [recognizer translationInView:self.view];
CGPoint newCenter = CGPointMake(recognizer.view.center.x+ translation.x,
recognizer.view.center.y);// 限制螢幕範圍:
newCenter.y = MAX(recognizer.view.frame.size.height/2, newCenter.y);
newCenter.y = MIN(self.view.frame.size.height - recognizer.view.frame.size.height/2, newCenter.y);
newCenter.x = MAX(recognizer.view.frame.size.width/2, newCenter.x);
newCenter.x = MIN(self.view.frame.size.width - recognizer.view.frame.size.width/2,newCenter.x);
if (newCenter.x> self.backImage.frame.origin.x + recognizer.view.frame.size.width/2 && newCenter.x<self.backImage.frame.origin.x -recognizer.view.frame.size.width/2 + self.backImage.frame.size.width) {
recognizer.view.center = newCenter;
[recognizer setTranslation:CGPointZero inView:self.view];
float value = (newCenter.x - self.backImage.frame.origin.x-recognizer.view.frame.size.width/2)/ (self.backImage.frame.size.width-recognizer.view.frame.size.width) ;
NSLog(@"%.2f",value);
[_vibrationTimer invalidate];
AudioServicesRemoveSystemSoundCompletion(sound);
AudioServicesDisposeSystemSoundID(sound);
value = value< 0.1 ? 2 : value;
_vibrationTimer = [NSTimer scheduledTimerWithTimeInterval:1/(value *5) target:self selector:@selector(playkSystemSound) userInfo:nil repeats:YES];
}
}
複製程式碼
8.單次體驗 簡單的加了一個延時操作,用於銷燬定時器
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[_vibrationTimer setFireDate:[NSDate distantFuture]];
});
複製程式碼
大功告成