真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在iOS中使用CoreMotion實(shí)現(xiàn)搖一搖功能-創(chuàng)新互聯(lián)

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

10年積累的網(wǎng)站制作、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有河池免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
//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)讓當(dāng)前controller成為firstResponder 
[self becomeFirstResponder]; 
//已經(jīng)不需要其它多余代碼了

這個(gè)方法最簡(jiǎn)單,但這個(gè)功能有時(shí)候會(huì)失效。它失效的時(shí)候,系統(tǒng)所有搖一搖撤銷重做都會(huì)不起作用,從而導(dǎo)致包括所有關(guān)聯(lián)的Shake事件也不起作用。失效原因或在什么情況下失效,目前還沒有相關(guān)資料。據(jù)這兩天個(gè)人觀察,大多發(fā)生在手機(jī)放在褲袋中走10多分鐘路之后(iPhone5S iOS 7.05).是否因?yàn)閾u得太久了,系統(tǒng)為了省電就關(guān)閉此功能呢?希望大家也拿自己手機(jī)來試一試,我們一起來看看這到底是什么問題。

要恢復(fù),最直接的是連接iTunes,否則,就要讓手機(jī)平放一段時(shí)間,但時(shí)候平放一天都沒有恢復(fù)。所以說此方式不太穩(wěn)定,微信及其它有搖一搖功能的應(yīng)用,他們的搖一搖并不受此影響,而且微信的搖一搖動(dòng)作比ShakeToEdit要輕,可以講手動(dòng)動(dòng)一下就激活了。于是我認(rèn)為,這些應(yīng)用都放棄了ShakeToEdit,使用了加速儀,自己重新實(shí)現(xiàn)。

使用加速儀與使用相機(jī),聲音之類不同,不需要經(jīng)過用戶允許,也沒有訪問限制,當(dāng)然也沒什么危害,是個(gè)基本配備。那要怎么做?下面費(fèi)話不多說,直接開始吧:

第一步,為項(xiàng)目TARGET添加CoreMotion.framework

怎么在iOS中使用CoreMotion實(shí)現(xiàn)搖一搖功能

第二步,引入頭文件

#import 

第三步,使用CMMotionManager

@property (strong,nonatomic) CMMotionManager *motionManager;

注意,當(dāng)前應(yīng)用只能有一個(gè)CMMotionManager實(shí)例,多個(gè)實(shí)例會(huì)影響接收速率

第四步,實(shí)例并初始化加速儀

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個(gè)方向的加速度 
  double accelerameter =sqrt( pow( acceleration.x , 2 ) + pow( acceleration.y , 2 ) 
     + pow( acceleration.z , 2) ); 
  //當(dāng)綜合加速度大于2.3時(shí),就激活效果(此數(shù)值根據(jù)需求可以調(diào)整,數(shù)據(jù)越小,用戶搖動(dòng)的動(dòng)作就越小,越容易激活,反之加大難度,但不容易誤觸發(fā)) 
  if (accelerameter>2.3f) { 
 //立即停止更新加速儀(很重要?。?nbsp;
    [self.motionManager stopAccelerometerUpdates]; 
     
    dispatch_async(dispatch_get_main_queue(), ^{ 
      //UI線程必須在此block內(nèi)執(zhí)行,例如搖一搖動(dòng)畫、UIAlertView之類 
    }); 
  }   
} 
-(void)viewDidDisappear:(BOOL)animated 
{ 
  //停止加速儀更新(很重要!) 
  [self.motionManager stopAccelerometerUpdates]; 
}

最后一步

至此,搖一搖核心已經(jīng)實(shí)現(xiàn),但還差最后一步:當(dāng)App退到后臺(tái)時(shí)必須停止加速儀更新,回到當(dāng)前時(shí)重新執(zhí)行。否則應(yīng)用在退到后臺(tái)依然會(huì)接收加速度更新,可能會(huì)與其它當(dāng)前應(yīng)用沖突,產(chǎn)生不好的體驗(yà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];
//對(duì)應(yīng)上面的通知中心回調(diào)的消息接收 
-(void)receiveNotification:(NSNotification *)notification 
{ 
  if ([notification.name  
    isEqualToString:UIApplicationDidEnterBackgroundNotification]) 
  { 
    [self.motionManager stopAccelerometerUpdates]; 
  }else{ 
    [self startAccelerometer]; 
 }}

至此,所有使用加速儀實(shí)現(xiàn)搖一搖功能的實(shí)現(xiàn)方式已介紹完畢。

一些可改進(jìn)的地方:

1) 搖一搖動(dòng)作捕捉——如果僅是以加速度大小來判定,有可能用戶突然快速移動(dòng)手機(jī)時(shí)就激活了搖動(dòng),但用戶比較稍稍慢一些來回晃動(dòng)手機(jī)卻不會(huì)激活,可能與用戶期望的稍微有出入。系統(tǒng)的ShakeToEdit就能做得比較到位。
 我們可以結(jié)合定時(shí)器與加速度的正反方向來更精確判定用戶的搖一搖動(dòng)作,例如:綜合加速度改為帶方向的向量,然后當(dāng)1.5秒內(nèi)有相反兩個(gè)方向大于某個(gè)數(shù)值的加速度,才算為一個(gè)搖動(dòng)行為。這個(gè)1.5秒時(shí)間需要通過實(shí)際測(cè)試來取值,當(dāng)某次取得的加速度值大于某個(gè)值開始統(tǒng)計(jì)下一個(gè)加速度向量,此值也需要實(shí)測(cè)來取值,可能1.5左右就夠了。

2) App狀態(tài)更改——如果激活的搖一搖是個(gè)長(zhǎng)時(shí)間等待行為,例如彈出ActionSheet讓用戶選擇操作。在用戶進(jìn)行下一步操作前,ActionSheet沒消失前,不應(yīng)該啟動(dòng)下一次監(jiān)聽,包括應(yīng)用從后臺(tái)回到當(dāng)前狀態(tài)后,也要判斷用戶是否有過下一步行為。

上述內(nèi)容就是怎么在iOS中使用CoreMotion實(shí)現(xiàn)搖一搖功能,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)站欄目:怎么在iOS中使用CoreMotion實(shí)現(xiàn)搖一搖功能-創(chuàng)新互聯(lián)
本文路徑:http://weahome.cn/article/dgsehd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部