【移動應(yīng)用開發(fā)技術(shù)】怎么在iOS中使用CoreMotion實現(xiàn)搖一搖功能_第1頁
【移動應(yīng)用開發(fā)技術(shù)】怎么在iOS中使用CoreMotion實現(xiàn)搖一搖功能_第2頁
【移動應(yīng)用開發(fā)技術(shù)】怎么在iOS中使用CoreMotion實現(xiàn)搖一搖功能_第3頁
【移動應(yīng)用開發(fā)技術(shù)】怎么在iOS中使用CoreMotion實現(xiàn)搖一搖功能_第4頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】怎么在iOS中使用CoreMotion實現(xiàn)搖一搖功能

本篇文章為大家展示了怎么在iOS中使用CoreMotion實現(xiàn)搖一搖功能,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。//ViewController

加入以下兩方法

-(BOOL)canBecomeFirstResponder

{

//讓當(dāng)前controller可以成為firstResponder,這很重要

return

YES;

}

-(void)motionEnded:(UIEventSubtype)motion

withEvent:(UIEvent

*)event

{

if

(event.subtype==UIEventSubtypeMotionShake)

{

//做你想做的事

}

}

//在viewDidView中調(diào)用以下消息,主動讓當(dāng)前controller成為firstResponder

[self

becomeFirstResponder];

//已經(jīng)不需要其它多余代碼了這個方法最簡單,但這個功能有時候會失效。它失效的時候,系統(tǒng)所有搖一搖撤銷重做都會不起作用,從而導(dǎo)致包括所有關(guān)聯(lián)的Shake事件也不起作用。失效原因或在什么情況下失效,目前還沒有相關(guān)資料。據(jù)這兩天個人觀察,大多發(fā)生在手機放在褲袋中走10多分鐘路之后(iPhone5SiOS7.05).是否因為搖得太久了,系統(tǒng)為了省電就關(guān)閉此功能呢?希望大家也拿自己手機來試一試,我們一起來看看這到底是什么問題。要恢復(fù),最直接的是連接iTunes,否則,就要讓手機平放一段時間,但時候平放一天都沒有恢復(fù)。所以說此方式不太穩(wěn)定,微信及其它有搖一搖功能的應(yīng)用,他們的搖一搖并不受此影響,而且微信的搖一搖動作比ShakeToEdit要輕,可以講手動動一下就激活了。于是我認(rèn)為,這些應(yīng)用都放棄了ShakeToEdit,使用了加速儀,自己重新實現(xiàn)。使用加速儀與使用相機,聲音之類不同,不需要經(jīng)過用戶允許,也沒有訪問限制,當(dāng)然也沒什么危害,是個基本配備。那要怎么做?下面費話不多說,直接開始吧:第一步,為項目TARGET添加CoreMotion.framework

第二步,引入頭文件#import

<CoreMotion/CoreMotion.h>第三步,使用CMMotionManager@property

(strong,nonatomic)

CMMotionManager

*motionManager;注意,當(dāng)前應(yīng)用只能有一個CMMotionManager實例,多個實例會影響接收速率第四步,實例并初始化加速儀self.motionManager

=

[[CMMotionManager

alloc]

init];//一般在viewDidLoad中進(jìn)行

self.motionManager.accelerometerUpdateInterval

=

.1;//加速儀更新頻率,以秒為單位第五步,開始接收加速儀數(shù)據(jù)(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)

);

//當(dāng)綜合加速度大于2.3時,就激活效果(此數(shù)值根據(jù)需求可以調(diào)整,數(shù)據(jù)越小,用戶搖動的動作就越小,越容易激活,反之加大難度,但不容易誤觸發(fā))

if

(accelerameter>2.3f)

{

//立即停止更新加速儀(很重要?。?/p>

[self.motionManager

stopAccelerometerUpdates];

dispatch_async(dispatch_get_main_queue(),

^{

//UI線程必須在此block內(nèi)執(zhí)行,例如搖一搖動畫、UIAlertView之類

});

}

}

-(void)viewDidDisappear:(BOOL)animated

{

//停止加速儀更新(很重要?。?/p>

[self.motionManager

stopAccelerometerUpdates];

}最后一步至此,搖一搖核心已經(jīng)實現(xiàn),但還差最后一步:當(dāng)App退到后臺時必須停止加速儀更新,回到當(dāng)前時重新執(zhí)行。否則應(yīng)用在退到后臺依然會接收加速度更新,可能會與其它當(dāng)前應(yīng)用沖突,產(chǎn)生不好的體驗。所以,分別在viewDidAppear和viewDidDisappear中加入如下監(jiān)聽://viewDidAppear中加入

[[NSNotificationCenter

defaultCenter]

addObserver:self

selector:@selector(receiveNotification:)

name:UIApplicationDidEnterBackgroundNotification

object:nil];

[[NSNotificationCenter

defaultCenter]

addObserver:self

selector:@selector(receiveNotification:)

name:UIApplicationWillEnterForegroundNotification

object:nil];//viewDidDisappear中取消監(jiān)聽

[[NSNotificationCenter

defaultCenter]

removeObserver:self

name:UIApplicationDidEnterBackgroundNotification

object:nil];

[[NSNotificationCenter

defaultCenter]

removeObserver:self

name:UIApplicationWillEnterForegroundNotification

object:nil];//對應(yīng)上面的通知中心回調(diào)的消息接收

-(void)receiveNotification:(NSNotification

*)notification

{

if

([

isEqualToString:UIApplicationDidEnterBackgroundNotification])

{

[self.motionManager

stopAccelerometerUpdates];

}else{

[self

startAccelerometer];

}}至此,所有使用加速儀實現(xiàn)搖一搖功能的實現(xiàn)方式已介紹完畢。一些可改進(jìn)的地方:1)搖一搖動作捕捉——如果僅是以加速度大小來判定,有可能用戶突然快速移動手機時就激活了搖動,但用戶比較稍稍慢一些來回晃動手機卻不會激活,可能與用戶期望的稍微有出入。系統(tǒng)的ShakeToEdit就能做得比較到位。我們可以結(jié)合定時器與加速度的正反方向來更精確判定用戶的搖一搖動作,例如:綜合加速度改為帶方向的向量,然后當(dāng)1.5秒內(nèi)有相反兩個方向大于某個數(shù)值的加速度,才算為一個搖動行為。這個

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論