本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的第1章,第1.8节使用加速度移动屏幕上的对象,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.8 使用加速度移动屏幕上的对象
iOS 6高级开发手册(第4版)
借助一点编程工作,iPhone的机载加速计就可以使对象在屏幕上四处“移动”,实时响应用户倾斜手机的方式。秘诀1-4创建了一只动画式的蝴蝶,用户可以使之快速移过屏幕。

使之工作的秘密在于:向程序中添加一个所谓的“物理计时器”。它不是直接响应加速中的变化,而是像秘诀1-3所做的那样,加速计回调用于测量当前的力。它取决于计时器例程随着时间的推移通过改变它的画面对蝴蝶应用那些力。下面列出了一些要记住的关键点。

只要力的方向仍然保持相同,蝴蝶就会加速。它的速度会依据加速力在x或y方向上的量度成比例地提高。
由计时器调用的tick例程将通过向蝴蝶的原点添加速度向量来移动蝴蝶。
蝴蝶移动的范围是有界限的。因此,当它撞到某个边缘时,将会停止在那个方向上移动。这可以一直把蝴蝶保留在屏幕上。tick方法将会检查界限条件。例如,如果蝴蝶撞到垂直边缘,那它仍然可以在水平方向上移动。
蝴蝶会改变它自身的方向,使之总是“下落”。可以在tick方法中应用一个简单的旋转变换来实现这一点。在使用变换时,还要关注画面或中心偏移。在应用偏移之前,总是要重置数学处理,然后重新应用任何角度改变。不这样做的话,可能导致画面出人意料地放大、收缩或扭曲。
注意:

{计时器在自然状态下不会处理块。如果你愿意使用基于块的设计,可以查询github,找到它的解决办法。} 秘诀1-4 基于加速计的反馈移动屏幕上的对象

- (void)accelerometer:(UIAccelerometer *)accelerometerdidAccelerate:(UIAcceleration *)acceleration
{// Extract the acceleration componentsfloat xx = -acceleration.x;float yy = acceleration.y;// Store the most recent angular offsetmostRecentAngle = atan2(yy, xx);// Has the direction changed?float accelDirX = SIGN(xvelocity) * -1.0f;float newDirX = SIGN(xx);float accelDirY = SIGN(yvelocity) * -1.0f;float newDirY = SIGN(yy);// Accelerate. To increase viscosity lower the additive valueif (accelDirX == newDirX) xaccel =(abs(xaccel) + 0.85f) * SIGN(xaccel);if (accelDirY == newDirY) yaccel =(abs(yaccel) + 0.85f) * SIGN(yaccel);// Apply acceleration changes to the current velocityxvelocity = -xaccel * xx;yvelocity = -yaccel * yy;
}- (void) tick
{// Reset the transform before changing positionbutterfly.transform = CGAffineTransformIdentity;// Move the butterfly according to the current velocity vectorCGRect rect = CGRectOffset(butterfly.frame, xvelocity, 0.0f);if (CGRectContainsRect(self.view.bounds, rect))butterfly.frame = rect;rect = CGRectOffset(butterfly.frame, 0.0f, yvelocity);if (CGRectContainsRect(self.view.bounds, rect))butterfly.frame = rect;// Rotate the butterfly independently of positionbutterfly.transform =CGAffineTransformMakeRotation(mostRecentAngle + M_PI_2);
}- (void) initButterfly
{CGSize size;// Load the animation cellsNSMutableArray *butterflies = [NSMutableArray array];for (int i = 1; i <= 17; i++){NSString *fileName = [NSString stringWithFormat:@"bf_%d.png", i];UIImage *image = [UIImage imageNamed:fileName];size = image.size;[butterflies addObject:image];}// Begin the animationbutterfly = [[UIImageView alloc]initWithFrame:(CGRect){.size=size}];[butterfly setAnimationImages:butterflies];butterfly.animationDuration = 0.75f;[butterfly startAnimating];// Set the butterfly's initial speed and accelerationxaccel = 2.0f;yaccel = 2.0f;xvelocity = 0.0f;yvelocity = 0.0f;// Add the butterflybutterfly.center = RECTCENTER(self.view.bounds);[self.view addSubview:butterfly];// Activate the accelerometer[[UIAccelerometer sharedAccelerometer] setDelegate:self];// Start the physics timer[NSTimer scheduledTimerWithTimeInterval: 0.03ftarget: self selector: @selector(tick)userInfo: nil repeats: YES];
}

获取这个秘诀的代码
{要查找这个秘诀的完整示例项目,可以浏览https://github.com/erica/iOS-6-Advanced-Cookbook,并进入第1章的文件夹。}

获取这个秘诀的代码

要查找这个秘诀的完整示例项目,可以浏览 https://github.com/erica/iOS-6-Advanced-Cookbook , 并进入第 1 章的文件夹。

《iOS 6高级开发手册(第4版)》——1.8节使用加速度移动屏幕上的对象相关推荐

  1. 《iOS 6高级开发手册(第4版)》——1.11节秘诀:获取和使用设备姿势

    本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的第1章,第1.11节秘诀:获取和使用设备姿势,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异 ...

  2. 《iOS 6高级开发手册(第4版)》——导读

    本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的目录,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 第 ...

  3. 《iOS 6高级开发手册(第4版)》——1.5节秘诀:使用加速能力“向上”定位

    本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的第1章,第1.5节秘诀:使用加速能力"向上"定位,作者 [美]Erica Sadun,更多章节内容可以访 ...

  4. 《iOS 6高级开发手册(第4版)》——2.5节秘诀:Quick Look预览控制器

    本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的第2章,第2.5节秘诀:Quick Look预览控制器,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区&q ...

  5. 《iOS 6核心开发手册(第4版)》——2.1节UIControl类

    本节书摘来自异步社区<iOS 6核心开发手册(第4版)>一书中的第2章,第2.1节UIControl类,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异步社区 ...

  6. 《iOS 6核心开发手册(第4版)》——2.11节秘诀:构建星星滑块

    本节书摘来自异步社区<iOS 6核心开发手册(第4版)>一书中的第2章,第2.11节秘诀:构建星星滑块,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异步社区 ...

  7. 黄山归来不看岳:《Java开发手册(黄山版)》新增 11 条新规约

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料视 作者:海牙秋天 原文地址:https://www.cfanz.c ...

  8. 全新出击!《Java开发手册(嵩山版)》解读手册升级下载

    简介:<〈Java开发手册(嵩山版)〉灵魂15问>重磅来袭!"一线大厂如何用Java"解读再升级,千万阅读量博主深究Java规约背后的原理.规范学好Java还不来看一看 ...

  9. 史上最强《Java 开发手册》泰山版王者归来

    "荡胸生层云,决眦入归鸟",<Java 开发手册(泰山版)>正式和大家伙见面了!秉承着"码出高效,码出质量"的一贯愿景,泰山小哥跳着欢快的步伐向大家 ...

最新文章

  1. 去除警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
  2. 优化网站性能 提高网站速度访问速度的14条实践
  3. 三家逐鹿,私有化部署能帮神策数据杀出重围么?| 公司调研
  4. 【前端统计图】echarts改变颜色属性的demo
  5. Cent OS 6.4安装mysql
  6. mysql8.0主从配置,MySQL 8.0主从服务器(Master-Slave)配置
  7. 面试题:Fibonacci数列
  8. python 描述器 详解_深入解析Python中的descriptor描述器的作用及用法
  9. vim编码设置问题(转)
  10. 卡尔曼滤波器的一种形象表达
  11. Java零拷贝四步曲——HeapByteBuffer与DirectByteBuffer
  12. 2017:社保再选管理人基金公司争“主力”
  13. 【转】 Pro Android学习笔记(五八):Preferences(2):CheckBoxPreference
  14. 记一次JPA项目启动速度优化
  15. 成年人夜生活的自救! 华熙LIVE·五棵松放大招
  16. 关于元素定位使用class_name定位报错的部分问题Unable to locate element: {“method“:“css selector“
  17. kafka 不可以脱离 zookeeper
  18. you-get使用方法
  19. 华为设备常见AAA操作
  20. 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库...

热门文章

  1. 面试问题记录1:IP子网规划
  2. 一个在职的软件测试的日常工作是怎么样的?
  3. ios 微信分享重新编码链接_微信民众号IOS端复制链接失足,安卓端分享链接翻开只能进入首页等题目的处理...
  4. git .gitignore file does not work
  5. 三合一乐高迷你机器人_乐高太贵?这10个品牌积木玩具购买指南请收好
  6. python网页内容获取记录pkg
  7. java遍历范型list_Java 集合(1)-- 俯瞰 Java 集合源码以及分类
  8. 从零开始刷Leetcode——数组(31.33)
  9. 教程: UNet/UNet++多类别图像分割,含数据集制作
  10. 手撕深度学习框架,原理很简单