iOS 手機振動棒

西門吹霧發表於2018-01-01

閒來無事,分享一個妹子使用利器,shakeTool感覺汙汙的,記得在大學時候用安卓手機的時候見過類似的app,簡單寫了一個demo,喜歡的朋友歡迎分享轉發。 我們先來看一下效果圖

iOS 手機振動棒

功能很簡單,分為三種:

  • 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_Vibrateservice中的震動效果

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]];
        
    });
複製程式碼

大功告成

demo下載

相關文章