怎么在ios中使用coremotion实现摇一摇功能加速计

摇一摇频率加速器ios

怎么在iOS中使用CoreMotion实现摇一摇功能

公布时间: 2021-03-26 17:26:56 作者: Leah 栏目: 移动开发

本篇文章为大家展示了怎么在iOS中使用CoreMotion实现摇一摇功能,内容简明扼要而且轻易明白,绝对能使你面前一亮,通过这篇文章的具体介绍盼望你能有所收获。

//ViewController 参加以下两方法 -(BOOL)ca!nBecomeFirstResponder { //让当前controller可以成为firstResponder,这很重要 return YES; } -(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype==UIEventSubtypeMotionShake) { //做你想做的事 } } //在viewDidView中调用以下消息,主动让当前controller成为firstResponder [self becomeFirstResponder]; //已经不需要别的多余代码了

这个方法最简单,但这个功能偶然候会失效。它失效的时间,系统全部摇一摇撤除重做都市不起作用,从而导致包括全部关联的Shake事件也不起作用。失效缘故或在什么环境下失效,现在还没有相关资料。据这两天个人察看,大多发生在手机放在裤袋中走10多分钟路之后(iPhone5S iOS 7.05).是否由于摇得太久了,系统为了省电就封闭此功能呢?盼望大家也拿自己手机来试一试,我们一起来看看这到底是什么问题。

要恢复,最直接的是连接iTunes,不然,就要让手机平放一段时间,但时间平放一天都没有恢复。以是说此方法不太稳定,微信及别的有摇一摇功能的应用,他们的摇一摇并不受此影响,并且微信的摇一动摇作比ShakeToEdit要轻,可以讲手动动一下就激活了。于是我以为,这些应用都放弃了ShakeToEdit,使用了加速仪,自己重新实现。

使用加速仪与使用相机,声音之类差别,不需要经过用户容许,也没有访问限定,固然也没什么危害,是个基本配备。那要怎么做?下面费话不多说,直接开始吧:

第一步 ,为项目TARGET添加CoreMotion.framework

怎么在iOS中使用CoreMotion实现摇一摇功能

第二步 ,引入头文件

#import <CoreMotion/CoreMotion.h>

第三步 ,使用CMMotionManager

@property (strong,nonatomic) CMMotionManager *motionManager;

留意,当前应用只能有一个CMMotionManager实例,多个实例会影响吸收速率

第四步 ,实例并初始化加速仪

self.motionManager = [[CMMotionManager alloc] init];//一样平常在viewDidLoad中进行 self.motionManager.accelerometerUpdateInterval = .1;//加速仪更新频率,以秒为单位

第五步 ,开始吸收加速仪数据(startAccelerometerUpdatesToQueue:withHandler:)

-(void)viewDidAppear:(BOOL)animated { [self startAccelerometer]; } -(void)startAccelerometer { //以push的方法更新并在block中吸收加速率 [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc]init] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { [self outputAccelertionData:accelerometerData.acceleration]; if (error) { NSLog(@"motion error:%@",error); } }]; } -(void)outputAccelertionData:(CMAcceleration)acceleration { //综合3个方向的加速率 do!uble accelerameter =sqrt( pow( acceleration.x , 2 ) + pow( acceleration.y , 2 ) + pow( acceleration.z , 2) ); //当综合加速率大于2.3时,就激活效果(此数值根据需求可以调整,数据越小,用户动摇的行动就越小,越轻易激活,反之加浩劫度,但不轻易误触发) if (accelerameter>2.3f) { //立刻停止更新加速仪(很重要!) [self.motionManager stopAccelerometerUpdates]; dispatch_async(dispatch_get_main_queue(), ^{ //UI线程必须在此block内实行,比方摇一动摇画、UIAlertView之类 }); } } -(void)viewDidDisappear:(BOOL)animated { //停止加速仪更新(很重要!) [self.motionManager stopAccelerometerUpdates]; }
最后一步

至此,摇一摇焦点已经实现,但还差最后一步:当App退到后台时必须停止加速仪更新,回到当前时重新实行。不然应用在退到后台依然会吸收加速率更新,大概会与别的当前应用冲突,产生不好的体验。以是,分别在viewDidAppear和viewDidDisappear中参加如下监听:

//viewDidAppear中参加 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:UIApplicationDidEnterBackgroundNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:UIApplicationWillEnterForegroundNotification object:nil];
//viewDidDisappear中取消监听 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
//对应上面的通知中心回调的消息吸收 -(void)receiveNotification:(NSNotification *)notification { if ([notification.name isEqualToString:UIApplicationDidEnterBackgroundNotification]) { [self.motionManager stopAccelerometerUpdates]; }else{ [self startAccelerometer]; }}

至此,全部使用加速仪实现摇一摇功能的实现方法已介绍完毕。

一些可革新的地方:

1) 摇一动摇作捕获——假如仅是以加速率大小来判断,有大概用户忽然快速移动手机时就激活了动摇,但用户比较稍稍慢一些往返晃动手机却不会激活,大概与用户盼望的轻微有出入。系统的ShakeToEdit就能做得比较到位。
我们可以联合定时器与加速率的正反方向来更准确判断用户的摇一动摇作,比方:综合加速率改为带方向的向量,然后当1.5秒内有相反两个方向大于某个数值的加速率,才算为一个动摇行为。这个1.5秒时间需要通过实际测试来取值,当某次取得的加速率值大于某个值开始统计下一个加速率向量,此值也需要实测来取值,大概1.5左右就够了。

2) App状态变动——假如激活的摇一摇是个长时间等候行为,比方弹出ActionSheet让用户选择操作。在用户进行下一步操作前,ActionSheet没消散前,不应该启动下一次监听,包括应用从后台回到当前状态后,也要判定用户是否有过下一步行为。

上述内容就是怎么在iOS中使用CoreMotion实现摇一摇功能,你们学到知识或技能了吗?假如还想学到更多技能要么丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

第一种加速计 正确判定手机晃动
#import <CoreMotion/CoreMotion.h> 框架 内里有一个 CMMotionManager *_manager;
@property(assign, nonatomic) NSTimeInterval accelerometerUpdateInterval //加速计的盘算时间

startAccelerometerUpdates
初始化CMMotionManager管理对象
调用管理对象的对象方法获取数据,有2种方法
处置数据
当你不需要使用的时间,停止获取数据
-(void)stopAccelerometerUpdates;//停止获取加速率计数据
- (void)startAccelerometerUpdates //开始获取加速计的数据
- (void)stopDeviceMotionUpdates //也是停止获取数据
-(void)startAccelerometerUpdatesToQueue:(NSOperationQueue*)queuewithHandler:(CMAccelerometerHandler)handler __TVOS_PROHIBITED; //开启获取加速计的数据 带有block 将 CMMotionManager加到队列中 制止数据并发性

空话不多说直接上代码

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; _manager = [[CMMotionManager alloc]init]; _manager.accelerometerUpdateInterval = 0.1; WEAKSELF [_manager startAccelerometerUpdatesToQueue:operationQueue withHandler:^(CMAccelerometerData *latestAcc, NSError *error) { dispatch_sync(dispatch_get_main_queue(), ^(void) { // 全部操作!进行同步 @synchronized(_manager) { //在这里进行动摇后的操作 [self confgStr]; }; }); }];

这是晃动是判定的三个轴
这里写图片描述

- (void)confgStr { //判定晃动的频率 if (fabs(_manager .accelerometerData .acceleration .x ) > 6.0 || fabs(_manager .accelerometerData .acceleration .y ) > 6.0 ||fabs(_manager .accelerometerData .acceleration .z ) > 6.0 ) { if (_isAdd) { // [NSThread sleepForTimeInterval: 0.3 ] [[EMCDDeviceManager sharedInstance] playVibration] NSString *str = _centerLabel .text _shakeNumber = _centerLabel .text = [NSString stringWithFormat:@ "%ld" ,[str integerValue] + 1 ] } } }

**第二种 系统自带摇一摇

[ UIApplication sharedApplication] .applicationSupportsShakeToEdit = YES ; [ self becomeFirstResponder]; //开始动摇 - (void) motionBegan: ( UIEventSubtype ) motion withEvent: ( UIEvent *) event __OSX_AVAILABLE_STARTING ( _ _ MAC_NA , _ _ IPHONE_3_0 ) ; //动摇结束 - (void) motionEnded: ( UIEventSubtype ) motion withEvent: ( UIEvent *) event __OSX_AVAILABLE_STARTING ( _ _ MAC_NA , _ _ IPHONE_3_0 ) ; //动摇被打断 好比打电话 系统等方法打断 - (void) motionCancelled: ( UIEventSubtype ) motion withEvent: ( UIEvent *) event __OSX_AVAILABLE_STARTING ( _ _ MAC_NA , _ _ IPHONE_3_0 ) ;

微信摇一摇帮助插件安装好该插件后 支持点击摇一摇免除真实动摇手机 支持版本:iOS >= 50 举报 开发者:wukong微信摇一摇帮助插件安装好该插件后 支。

微信摇一摇帮助插件 版本:10120150315 支持装备: iPhone iPad 历史版本 文件大小:1543KB 支持版本:iOS >= 50 举报。

微信摇一摇功能大家想必用过~ ios SDK帮我们完成了全部功作我们只需要添加相应的逻!辑即可下面贴出实当代码在对应的ViewController中添加如下代码: 。

iOS实现“摇一摇”与“扫一扫”功能作者:Foreverwj“摇一摇”功能的实现: iPhone对 “摇一摇”有很好的支持总体说来就两步: 在视图控制器中打开担当“摇一摇”的。

来吧无数的帅哥仙女等你摇让你摇个沉醉;摇一摇有缘人的邂逅地。 摇一摇网络帮助 | 搜狗高速browser官方版微信插件微信摇一摇怎么用 网络帮助 | 手机微信。

并可永世保存日程另有记账课程表体积小ios/android双版本【应用

支持摇一摇主动排序快速跨页移动app图标及批量整理另有类似苹果ios

本文网址: http://www.fbchamp.com/view/202141023637_2371_3593945180/home

推荐阅读

tags

最新发布