iOS 手机振动棒

闲来无事,分享一个妹子使用利器,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_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下载

转载于:https://juejin.im/post/5a45f8b7f265da430c122409

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值