iOS 仿百度外卖-首页重力感应的实例
发布时间 - 2026-01-10 22:15:54 点击率:次今天带来的是仿百度外卖首页的重力感应..(由于只能真机测试,手里测试机只有5s,所以有些地方并没有适配其他机型,需要的还需要根据真机自行适配)
来简单说下实现吧,之前重力感应都是用UIAccelerometer实现的,但是,好像是从iOS 4 以后,这个方法就废弃了,它被直接封装到了CoreMotion框架中,所以现在有关重力感应,加速计什么的都需要通过CoreMotion框架实现,这也算是苹果对于重力感应的整合吧.本文对CoreMotion框架只是进行了简单的使用,想要更深的使用,还是请自行 google(百度上的文档非常少).
好了.下面就是实现代码
(注意这里需要导入系统框架CoreMotion.framework)
//
// ViewController.m
// 仿百度外卖首页-重力感应
//
// 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的动态偏移量
}
@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_];
//在界面已经显示后在调用方法(优化)
[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{
//优化处理
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 - 重力感应
- (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) {
//回调会一直调用,建议获取到就调用下面的停止方法,需要再重新开始,当然如果需求是实时不间断的话可以等离开页面之后再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, 会出现顿的现象,加上动画就可解决这个问题
[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;
}
}
}
}];
}
}
//停止感应方法
- (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
到这里,就可以进行真机测试了..
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# iOS
# 仿百度外卖
# ios重力感应代码
# iOS中的NSURLCache数据缓存类用法解析
# Objective-C的缓存框架EGOCache在iOS App开发中的使用
# C++开发在IOS环境下运行的LRUCache缓存功能
# 使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
# iOS 条码及二维码扫描(从相册中读取条形码/二维码)及扫码过程中遇到的坑
# iOS实现时间显示几分钟前
# 几小时前以及刚刚的方法示例
# IOS正则表达式判断输入类型(整理)
# IOS 开发之应用唤起实现原理详解
# IOS TextFiled与TextView 键盘的收起以及处理键盘遮挡
# IOS与网页JS交互详解及实例
# IOS Cache设计详细介绍及简单示例
# 首页
# 的是
# 都是
# 偏移量
# 好了
# 是从
# 这也
# 就可
# 还需要
# 回调
# 解决这个问题
# 大家多多
# 移除
# 进行了
# 就可以
# 再重新
# 量为
# 触碰
# 手里
# 文档
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在阿里云香港服务器快速搭建网站?
JavaScript实现Fly Bird小游戏
Python文件流缓冲机制_IO性能解析【教程】
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Laravel如何实现事件和监听器?(Event & Listener实战)
JavaScript如何实现错误处理_try...catch如何捕获异常?
微信小程序 闭包写法详细介绍
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何在建站宝盒中设置产品搜索功能?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何注册花生壳免费域名并搭建个人网站?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Laravel Fortify是什么,和Jetstream有什么关系
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
JavaScript中的标签模板是什么_它如何扩展字符串功能
如何快速上传建站程序避免常见错误?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
C++时间戳转换成日期时间的步骤和示例代码
用v-html解决Vue.js渲染中html标签不被解析的问题
原生JS获取元素集合的子元素宽度实例
如何在IIS服务器上快速部署高效网站?
魔方云NAT建站如何实现端口转发?
简单实现Android文件上传
使用Dockerfile构建java web环境
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何在搬瓦工VPS快速搭建网站?
手机网站制作与建设方案,手机网站如何建设?
详解Android图表 MPAndroidChart折线图
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
太平洋网站制作公司,网络用语太平洋是什么意思?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
公司网站制作价格怎么算,公司办个官网需要多少钱?
Java垃圾回收器的方法和原理总结
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
JavaScript如何实现倒计时_时间函数如何精确控制
JS弹性运动实现方法分析
Laravel怎么为数据库表字段添加索引以优化查询
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
利用JavaScript实现拖拽改变元素大小
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel如何实现数据库事务?(DB Facade示例)

