



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發技術】怎么在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
提交評論