iOS使用CoreMotion實現搖一搖功能

2022-09-21 14:18:09 字數 2981 閱讀 2167

現在網上介紹的ios搖一搖功能,基本是以借助系統的shaketoedit功能來實現,什麼是shaketoedit?看下圖應該就能懂:

怎麼實現?請看以下**:

//viewcontroller 加入以下兩方法

-(bool)canbecomefirstresponder

-(void)motionended:(uieventsubtype)motion withevent:(uievent *) }

//在viewdidview中呼叫以下訊息,主動讓當前controller成為firstresponder

[self becomefirstresponder];

//已經不需要其它多餘**了

這個方法最簡單,但這個功能有時候會失效。它失效的時候,系統所有搖一搖撤銷重做都會不起作用,從而導致包括所有關聯的shake事件也不起作用。失效原因或在什麼情況下失效,目前還沒有相關資料。據這兩天個人觀察,大多發生在手機放在褲袋中走10多分鐘路之後(iphone5s ios 7.05).是否因為搖得太久了,系統為了省電就關閉此功能呢?希望大家也拿自己手機來試一試,我們一起來看看這到底是什麼問題。

要恢復,最直接的是連線itunes,否則,就要讓手機平放一段時間,但時候平放一天都沒有恢復。所以說此方式不太穩定,微信及其它有搖一搖功能的應用,他們的搖一搖並不受此影響,而且微信的搖一搖動作比shaketoedit要輕,可以講手動動一下就啟用了。於是我認為,這些應用都放棄了shaketoedit,使用了加速儀,自己重新實現。

使用加速儀與使用相機,聲音之類不同,不需要經過使用者允許,也沒有訪問限制,當然也沒什麼危害,是個基本配備。那要怎麼做?下面費話不多說,直接開始吧:

第一步,為專案target新增coremotion.framework

第二步,引入標頭檔案

#import

第三步,使用cmmotionmanager

@property (strong,nonatomic) cmmotionmanager *motionmanager;

注意,當前應用只能有乙個cmmotionmanager例項,多個例項會影響接收速率

第四步,例項並初始化加速儀

self.motionmanager = [[cmmotionmanager alloc] init];//一般在viewdidload中進行

self.motionmanager.accelerometerupdateinterval = .1;//加速儀更新頻率,以秒為單位

第五步,開始接收加速儀資料(startaccelerometerupdatestoqueue:withhandler:)

-(void)viewdidappear程式設計客棧:(bool)animated

-(void)startaccelerometer

}];

} -(void)outputaccelertiondata:(cmacceleration)acceleration

); }

} -(void)viewdiddisappear:(bool)animated

最後一步

至此,搖一搖核心已經實現,但還差最後一步:當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

else}

至此,所有使用加速儀實現搖一搖功能的實現方式已介紹完畢。

一些可改進的地方:

1) 搖一搖動作捕捉——如果僅是以加速度大小來判定,有可能使用者突然快速移動手機時就啟用了搖動,但使用者比較稍稍慢一些來回晃動手機卻不會啟用,可能與使用者期望的稍微有出入。系統的shaketoedit就能做得比較到位。

我們可以結合定時器與加速度的正反方向來更精確判定使用者的搖一搖動作,例如:綜合加速度改為帶方向的向量,然後當1.5秒內有相反兩個方向大於某個數值的加速度,才算為乙個搖動行為。這個1.5秒時間需要通過實際測試來取值,當某次取得的加速度值大於某個值開始統計下乙個加速度向量,此值也需要實測來取值,可能1.5左右就夠了。

2) app狀態更改——如果啟用的搖一搖是個長時間等待行為,例如彈出actionsheet讓使用者選擇操作。在使用者進行下一步操作前,actionsheet沒消失前,不應該啟動下一次監聽,包括應用從後台回到當前狀態後,也要判斷使用者是否有過下一步行為。

本文標題: ios使用coremotion實現搖一搖功能

本文位址:

IOS 陣列使用

arc下 定義陣列 nsmutablearray tt和nsmutablearray tb 當nsmutablearray tb nsmutablearray alloc init nsdictionary d nsdictionary dictionarywithobject 123 forkey...

iOS使用濾鏡

ciimage.這個類儲存影象資料。它可以從uiimage 影象檔案 或者是畫素資料中構造出來。cifilter.濾鏡類包含乙個字典結構,對各種濾鏡定義了屬於他們各自的屬性。濾鏡有很多種,比如鮮豔程度濾鏡,色彩反轉濾鏡,剪裁濾鏡等等。把uiimage轉換成濾鏡可以操作的ciimage ciimage...

ios 記憶體使用陷阱

在iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具leaks 檢測出來,並一一改之,但有些是因為ios 的缺陷和用法上的錯誤,leaks 檢測工具並不能檢測出來,你只會看到大量的記憶體被使用,最後收到didreceivememorywarning,最終導致程式崩潰。以下是開發過程中遇...