iOS 仿百度外賣(mài)-首頁(yè)重力感應(yīng)的實(shí)例
今天帶來(lái)的是仿百度外賣(mài)首頁(yè)的重力感應(yīng)..(由于只能真機(jī)測(cè)試,手里測(cè)試機(jī)只有5s,所以有些地方并沒(méi)有適配其他機(jī)型,需要的還需要根據(jù)真機(jī)自行適配)
來(lái)簡(jiǎn)單說(shuō)下實(shí)現(xiàn)吧,之前重力感應(yīng)都是用UIAccelerometer實(shí)現(xiàn)的,但是,好像是從iOS 4 以后,這個(gè)方法就廢棄了,它被直接封裝到了CoreMotion框架中,所以現(xiàn)在有關(guān)重力感應(yīng),加速計(jì)什么的都需要通過(guò)CoreMotion框架實(shí)現(xiàn),這也算是蘋(píng)果對(duì)于重力感應(yīng)的整合吧.本文對(duì)CoreMotion框架只是進(jìn)行了簡(jiǎn)單的使用,想要更深的使用,還是請(qǐng)自行 google(百度上的文檔非常少).
好了.下面就是實(shí)現(xiàn)代碼
(注意這里需要導(dǎo)入系統(tǒng)框架CoreMotion.framework)
// // ViewController.m // 仿百度外賣(mài)首頁(yè)-重力感應(yīng) // // Created by Amydom on 16/12/5. // Copyright © 2016年 Amydom. All rights reserved. // #import "ViewController.h" #import <CoreMotion/CoreMotion.h> @interface ViewController ()<UIScrollViewDelegate>{ NSTimeInterval updateInterval; CGFloat setx;//scroll的動(dòng)態(tài)偏移量 } @property (nonatomic,strong) CMMotionManager *mManager; @property (nonatomic , strong)UIScrollView *myScrollView; @property (nonatomic , assign)CGFloat offsetX;//初始偏移量 @property (nonatomic , assign)NSInteger offset; @end @implementation ViewController - (void)viewDidAppear:(BOOL)animated_{ [super viewDidAppear:animated_]; //在界面已經(jīng)顯示后在調(diào)用方法(優(yōu)化) [self startUpdateAccelerometerResult:0]; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; [self createView]; } - (void)createView{ //collectionView UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init]; UICollectionView *myCollection = [[UICollectionView alloc]initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:flowLayout]; myCollection.backgroundColor = [UIColor whiteColor]; [self.view addSubview:myCollection]; _myScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 22, self.view.frame.size.width, 100)]; _myScrollView.backgroundColor = [UIColor lightGrayColor]; _myScrollView.delegate = self; [self.view addSubview:_myScrollView]; for (int i = 0; i < 8; i ++) { NSString *name = [NSString stringWithFormat:@"%d.jpg",i + 1]; UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(5 + 885 * i, 10, 80, 80)]; image.image = [UIImage imageNamed:name]; image.backgroundColor = [UIColor orangeColor]; image.layer.masksToBounds = YES; image.layer.cornerRadius = 40; [_myScrollView addSubview:image]; //偏移量為最后 image 的 frame + origin _myScrollView.contentSize = CGSizeMake (image.frame.size.width + image.frame.origin.x, 10); } } //手指觸碰時(shí) - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ _offsetX = scrollView.contentOffset.x; [self stopUpdate]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ //優(yōu)化處理 setx = scrollView.contentOffset.x; _offset = scrollView.contentOffset.x - _offsetX; if (_offset > 0) { //left }else{ //right } } //手指離開(kāi)時(shí) - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ [self startUpdateAccelerometerResult:0]; } #pragma mark - 重力感應(yīng) - (CMMotionManager *)mManager { if (!_mManager) { updateInterval = 1.0/15.0; _mManager = [[CMMotionManager alloc] init]; } return _mManager; } //開(kāi)始 - (void)startUpdateAccelerometerResult:(void (^)(NSInteger))result { if ([self.mManager isAccelerometerAvailable] == YES) { //回調(diào)會(huì)一直調(diào)用,建議獲取到就調(diào)用下面的停止方法,需要再重新開(kāi)始,當(dāng)然如果需求是實(shí)時(shí)不間斷的話可以等離開(kāi)頁(yè)面之后再stop [self.mManager setAccelerometerUpdateInterval:updateInterval]; [self.mManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { double x = accelerometerData.acceleration.x; double y = accelerometerData.acceleration.y; if (fabs(y) >= fabs(x)) {//前后 if (y >= 0){ //Down } else{ //Portrait } } else { //左右 if (x >= 0){ setx += 10; if (setx <= 360) { //由于以10為單位改變 contentOffset, 會(huì)出現(xiàn)頓的現(xiàn)象,加上動(dòng)畫(huà)就可解決這個(gè)問(wèn)題 [UIView animateWithDuration:0.1 animations:^{ _myScrollView.contentOffset = CGPointMake(setx, 0); }]; //模仿 scroll 的回彈效果 if (setx == 360) { [UIView animateWithDuration:0.5 animations:^{ _myScrollView.contentOffset = CGPointMake(setx + 50, 0); } completion:^(BOOL finished) { [UIView animateWithDuration:0.5 animations:^{ _myScrollView.contentOffset = CGPointMake(setx , 0); }]; }]; } }else{ setx = 360; } }else{ setx -= 10; if (setx >= 0) { [UIView animateWithDuration:0.1 animations:^{ _myScrollView.contentOffset = CGPointMake(setx, 0); }]; //模仿 scroll 的回彈效果 if (setx == 0) { [UIView animateWithDuration:0.5 animations:^{ _myScrollView.contentOffset = CGPointMake(setx - 50, 0); } completion:^(BOOL finished) { [UIView animateWithDuration:0.5 animations:^{ _myScrollView.contentOffset = CGPointMake(setx, 0); }]; }]; } }else{ setx = 0; } } } }]; } } //停止感應(yīng)方法 - (void)stopUpdate { if ([self.mManager isAccelerometerActive] == YES) { [self.mManager stopAccelerometerUpdates]; } } //離開(kāi)頁(yè)面后停止(移除 mManager) - (void)dealloc { //制空,防止野指針 _mManager = nil; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
到這里,就可以進(jìn)行真機(jī)測(cè)試了..
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS中的NSURLCache數(shù)據(jù)緩存類用法解析
- Objective-C的緩存框架EGOCache在iOS App開(kāi)發(fā)中的使用
- C++開(kāi)發(fā)在IOS環(huán)境下運(yùn)行的LRUCache緩存功能
- 使用Javascript判斷瀏覽器終端設(shè)備(PC、IOS(iphone)、Android)
- iOS 條碼及二維碼掃描(從相冊(cè)中讀取條形碼/二維碼)及掃碼過(guò)程中遇到的坑
- iOS實(shí)現(xiàn)時(shí)間顯示幾分鐘前,幾小時(shí)前以及剛剛的方法示例
- IOS正則表達(dá)式判斷輸入類型(整理)
- IOS 開(kāi)發(fā)之應(yīng)用喚起實(shí)現(xiàn)原理詳解
- IOS TextFiled與TextView 鍵盤(pán)的收起以及處理鍵盤(pán)遮擋
- IOS與網(wǎng)頁(yè)JS交互詳解及實(shí)例
- IOS Cache設(shè)計(jì)詳細(xì)介紹及簡(jiǎn)單示例
相關(guān)文章
iOS 底部按鈕和應(yīng)用圖標(biāo)顯示未讀消息(帶數(shù)字)
本文主要介紹了iOS 底部按鈕和應(yīng)用圖標(biāo)顯示未讀消息的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04iOS實(shí)現(xiàn)萌貨貓頭鷹登錄界面動(dòng)畫(huà)
本文介紹的動(dòng)畫(huà)效果仿自國(guó)外網(wǎng)站readme.io的登錄界面,超萌可愛(ài)的貓頭鷹,感興趣的朋友們可以參考學(xué)習(xí)。2016-08-08iOS界面布局簡(jiǎn)化UIStackView使用詳解
這篇文章主要為大家介紹了iOS界面布局簡(jiǎn)化UIStackView使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09關(guān)于iOS 11的一些新特性適配實(shí)踐總結(jié)
iOS 11 為整個(gè)生態(tài)系統(tǒng)的 UI 元素帶來(lái)了一種更加大膽、動(dòng)態(tài)的新風(fēng)格。下面這篇文章主要給大家總結(jié)介紹了關(guān)于iOS 11的一些新特性適配實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11如何利用FutureBuilder提高開(kāi)發(fā)效率
這篇文章主要給大家介紹了關(guān)于如何利用FutureBuilder提高開(kāi)發(fā)效率的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07iOS模仿微信長(zhǎng)按識(shí)別二維碼的多種方式
這篇文章主要介紹了iOS模仿微信長(zhǎng)按識(shí)別二維碼的兩種方式,文章第二種方式是識(shí)別網(wǎng)頁(yè)中的二維碼,具體思路詳解大家參考下本文2017-07-07iOS UITextView 首行縮進(jìn) 撤銷輸入 反撤銷輸入的實(shí)現(xiàn)代碼
本文是腳本之家小編給大家分享的iOS UITextView 首行縮進(jìn) 撤銷輸入 反撤銷輸入的實(shí)現(xiàn)代碼,需要的朋友參考下吧2017-09-09