【移动应用开发技术】怎么在iOS中使用CoreMotion实现摇一摇功能_第1页
【移动应用开发技术】怎么在iOS中使用CoreMotion实现摇一摇功能_第2页
【移动应用开发技术】怎么在iOS中使用CoreMotion实现摇一摇功能_第3页
【移动应用开发技术】怎么在iOS中使用CoreMotion实现摇一摇功能_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在iOS中使用CoreMotion实现摇一摇功能

本篇文章为大家展示了怎么在iOS中使用CoreMotion实现摇一摇功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。//ViewController

加入以下两方法

-(BOOL)canBecomeFirstResponder

{

//让当前controller可以成为firstResponder,这很重要

return

YES;

}

-(void)motionEnded:(UIEventSubtype)motion

withEvent:(UIEvent

*)event

{

if

(event.subtype==UIEventSubtypeMotionShake)

{

//做你想做的事

}

}

//在viewDidView中调用以下消息,主动让当前controller成为firstResponder

[self

becomeFirstResponder];

//已经不需要其它多余代码了这个方法最简单,但这个功能有时候会失效。它失效的时候,系统所有摇一摇撤销重做都会不起作用,从而导致包括所有关联的Shake事件也不起作用。失效原因或在什么情况下失效,目前还没有相关资料。据这两天个人观察,大多发生在手机放在裤袋中走10多分钟路之后(iPhone5SiOS7.05).是否因为摇得太久了,系统为了省电就关闭此功能呢?希望大家也拿自己手机来试一试,我们一起来看看这到底是什么问题。要恢复,最直接的是连接iTunes,否则,就要让手机平放一段时间,但时候平放一天都没有恢复。所以说此方式不太稳定,微信及其它有摇一摇功能的应用,他们的摇一摇并不受此影响,而且微信的摇一摇动作比ShakeToEdit要轻,可以讲手动动一下就激活了。于是我认为,这些应用都放弃了ShakeToEdit,使用了加速仪,自己重新实现。使用加速仪与使用相机,声音之类不同,不需要经过用户允许,也没有访问限制,当然也没什么危害,是个基本配备。那要怎么做?下面费话不多说,直接开始吧:第一步,为项目TARGET添加CoreMotion.framework

第二步,引入头文件#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个方向的加速度

double

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

([

isEqualToString:UIApplicationDidEnterBackgroundNotification])

{

[self.motionManager

stopAccelerometerUpdates];

}else{

[self

startAccelerometer];

}}至此,所有使用加速仪实现摇一摇功能的实现方式已介绍完毕。一些可改进的地方:1)摇一摇动作捕捉——如果仅是以加速度大小来判定,有可能用户突然快速移动手机时就激活了摇动,但用户比较稍稍慢一些来回晃动手机却不会激活,可能与用户期望的稍微有出入。系统的ShakeToEdit就能做得比较到位。我们可以结合定时器与加速度的正反方向来更精确判定用户的摇一摇动作,例如:综合加速度改为带方向的向量,然后当1.5秒内有相反两个方向大于某个数值的加速度,才算为一个摇动行为。这个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论