本节课讲解了Core Motion框架的知识,简单介绍了app的生命周期,最后用一个方块碰撞游戏来对本节课的知识作总结。
Core Motion
CoreMotion是一个专门处理设备“动作”的框架,其中包含了加速度计,陀螺仪和磁力针。加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化。陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作;磁力针可以判断设备的方向。
CoreMotion的工作是基于CMMotionManager
类来执行的。我们看一下该类的API:
CMMotionManager
检测硬件设备:
1 | @property(readonly, nonatomic, getter=isAccelerometerAvailable) BOOL accelerometerAvailable __TVOS_PROHIBITED; |
开启相应的模块:
1 | - (void)startAccelerometerUpdates __TVOS_PROHIBITED; |
检测相应的模块是否正在收集数据:
1 | @property(readonly, nonatomic, getter=isAccelerometerActive) BOOL accelerometerActive __TVOS_PROHIBITED; |
关闭相应的模块:
1 | - (void)stopAccelerometerUpdates __TVOS_PROHIBITED; |
使用block监听
1 | - (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler __TVOS_PROHIBITED; |
CMMotionManager的工作步骤
- 首先初始化
CMMotionManager
类。 - 判断硬件设备的可使用性。
- 调用API
详细的使用方法请看Demo部分的讲解部分。
app的生命周期
程序在运行过程中,是由各种不同的状态的,在这些状态之间切换时可以执行一些代码用于满足一定的业务需求。
应用程序的几种状态:
- Not running:未运行 程序没启动
- Inactive:未激活, 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。
- Active:激活, 程序在前台运行而且接收到了事件。这是程序在前台运行的正常状态。
- Backgroud:后台, 程序在后台而且能执行代码。大多数程序进入这个状态后会在在这个状态上停留一会, 时间到之后会进入挂起状态(Suspended)。
- Suspended:挂起 ,程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为当前处于前台程序提供更多的内存。
应用程序的状态之间切换时调用的代理方法(AppDelegate):
1 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions //启动基本完成,程序准备开始运行时调用。 |
Demo
Demo需求:
- 显示两个小方块,一黑一红,二者可以随着屏幕的转动而移动。
- 由红色方块碰撞黑色方块来得分。
Demo效果图:
重要知识点和代码段:
1. 添加animator和重力行为和碰撞行为
1 | - (UIDynamicAnimator *)animator |
老规矩,还是要将animtor添加到view里面再向其添加各种动作行为。有关动画的讲解请参考笔者之前一篇总结:斯坦福大学iOS开发公开课总结(八) :协议,block,动画,俄罗斯方块Demo。
2. 根据偏移量来设置方块的位置
1 | - (UIView *)addBlockOffsetFromCenterBy:(UIOffset)offset |
在这里,使用了
CGRectGetMidX
函数来获得view的横向中心点。
3. 初始化红色和黑色方块
1 | self.redBlock = [self addBlockOffsetFromCenterBy:UIOffsetMake(-100, 0)]; |
在这里,红色方块具有碰撞和重力行为,但是黑色方块却只有碰撞行为。因为黑色是不受重力控制的,它的运动的触发只来自红色方块的碰撞。
4. 在程序即将要挂起或者恢复前台活动状态时进行暂停游戏的操作:
1 | [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification |
我们也可以在appdelegate里面来实现这些方法,不过个人认为将方法写在一起看起来比较直观
5. CMMotionManager的初始化和使用
1 | //初始化 |
最后的话
如果哪位小伙伴想拿到本文Demo的代码请不要客气,可以进入我的GitHub下载哦~ 这一系列到现在为止的所有Demo都在里面,分为英文注释版本和中文注释版本两种。
如果嫌麻烦的童鞋可以在留言留下邮箱,笔者会将Demo包发给你~
十分欢迎给笔者的代码和文笔抛出宝贵的意见和建议~
本文为笔者原创,如需转载,请事先与笔者交涉~
————————————————- 2018年7月17日更新 ————————————————-
注意注意!!!
笔者在近期开通了个人公众号,主要分享编程,读书笔记,思考类的文章。
- 编程类文章:包括笔者以前发布的精选技术文章,以及后续发布的技术文章(以原创为主),并且逐渐脱离 iOS 的内容,将侧重点会转移到提高编程能力的方向上。
- 读书笔记类文章:分享编程类,思考类,心理类,职场类书籍的读书笔记。
- 思考类文章:分享笔者平时在技术上,生活上的思考。
因为公众号每天发布的消息数有限制,所以到目前为止还没有将所有过去的精选文章都发布在公众号上,后续会逐步发布的。
而且因为各大博客平台的各种限制,后面还会在公众号上发布一些短小精干,以小见大的干货文章哦~
扫下方的公众号二维码并点击关注,期待与您的共同成长~