iOS 仿百度外賣-首頁重力感應(yīng)的實例
今天帶來的是仿百度外賣首頁的重力感應(yīng)..(由于只能真機測試,手里測試機只有5s,所以有些地方并沒有適配其他機型,需要的還需要根據(jù)真機自行適配)

來簡單說下實現(xiàn)吧,之前重力感應(yīng)都是用UIAccelerometer實現(xiàn)的,但是,好像是從iOS 4 以后,這個方法就廢棄了,它被直接封裝到了CoreMotion框架中,所以現(xiàn)在有關(guān)重力感應(yīng),加速計什么的都需要通過CoreMotion框架實現(xiàn),這也算是蘋果對于重力感應(yīng)的整合吧.本文對CoreMotion框架只是進(jìn)行了簡單的使用,想要更深的使用,還是請自行 google(百度上的文檔非常少).
好了.下面就是實現(xiàn)代碼
(注意這里需要導(dǎo)入系統(tǒng)框架CoreMotion.framework)
//
// ViewController.m
// 仿百度外賣首頁-重力感應(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的動態(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);
}
}
//手指觸碰時
- (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
}
}
//手指離開時
- (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;
}
//開始
- (void)startUpdateAccelerometerResult:(void (^)(NSInteger))result
{
if ([self.mManager isAccelerometerAvailable] == YES) {
//回調(diào)會一直調(diào)用,建議獲取到就調(diào)用下面的停止方法,需要再重新開始,當(dāng)然如果需求是實時不間斷的話可以等離開頁面之后再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, 會出現(xiàn)頓的現(xià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];
}
}
//離開頁面后停止(移除 mManager)
- (void)dealloc
{
//制空,防止野指針
_mManager = nil;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
到這里,就可以進(jìn)行真機測試了..
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS中的NSURLCache數(shù)據(jù)緩存類用法解析
- Objective-C的緩存框架EGOCache在iOS App開發(fā)中的使用
- C++開發(fā)在IOS環(huán)境下運行的LRUCache緩存功能
- 使用Javascript判斷瀏覽器終端設(shè)備(PC、IOS(iphone)、Android)
- iOS 條碼及二維碼掃描(從相冊中讀取條形碼/二維碼)及掃碼過程中遇到的坑
- iOS實現(xiàn)時間顯示幾分鐘前,幾小時前以及剛剛的方法示例
- IOS正則表達(dá)式判斷輸入類型(整理)
- IOS 開發(fā)之應(yīng)用喚起實現(xiàn)原理詳解
- IOS TextFiled與TextView 鍵盤的收起以及處理鍵盤遮擋
- IOS與網(wǎng)頁JS交互詳解及實例
- IOS Cache設(shè)計詳細(xì)介紹及簡單示例
相關(guān)文章
iOS中滑動控制屏幕亮度和系統(tǒng)音量(附加AVAudioPlayer基本用法和Masonry簡單使用)
這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統(tǒng)音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關(guān)資料,需要的朋友可以參考下2016-12-12
iOS開發(fā)Quick Actions創(chuàng)建桌面Icon快捷方式
在本文里我們給大家分享了關(guān)于iOS開發(fā)Quick Actions創(chuàng)建桌面Icon快捷方式的相關(guān)知識點內(nèi)容,需要的讀者們可以參考下。2019-05-05
詳談iOS 位置權(quán)限彈出框閃現(xiàn)的問題
下面小編就為大家?guī)硪黄斦刬OS 位置權(quán)限彈出框閃現(xiàn)的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
iOS動畫-定時對UIView進(jìn)行翻轉(zhuǎn)和抖動的方法
下面小編就為大家?guī)硪黄猧OS動畫-定時對UIView進(jìn)行翻轉(zhuǎn)和抖動的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04

