传感器的定义:是一种感应/检测装置,目前已经广泛应用于智能手机上。
作用:用于感应检测周边的信息。
比如检测声音, 光线,地图手机的朝向,贴近耳朵屏幕自动锁屏,关灯自动降低亮度不会那么亮眼, 等等。
常见的:
环境光传感器:犹豫环境变化,调节屏幕亮度; 或者拍照,闪光灯在夜晚会 自动开启;mac的背光键盘,当周围光线弱到一定条件自动开启键盘背光。 没有api. (自动调节屏幕亮度)
1. 距离传感器:打电话关闭屏幕,省电和防止意外操作; 语音,在耳边是话筒, 不在耳边是扩音。 (打电话自动所屏)
磁力计传感器: 电子罗盘, 导航应用; ipad的smart cover盒盖锁屏。 讲过了。 (合盖锁屏)
内部温度传感器:安全和稳定性。 没有api. (提醒用户降温,防止损伤设备)
湿度传感器:是一个简单的 物理传感器, 遇水变红。 没有api. (方便维修人员)
内部陀螺仪:iphone4以上,用于检测设备的握方式。 x,y,z所旋转的角速度。 模拟汽车方向盘的旋转动作。 (赛车类游戏)
2. 运动传感器/加速度传感器/加速计:(摇一摇, 计步器。 )
1. 距离传感器:打电话关闭屏幕,省电和防止意外操作; 语音,在耳边是话筒, 不在耳边是扩音。 (打电话自动所屏)
1. 开启功能。
2.监听通知。
3.实现监听方法。
2.加速计: 就是检测x,y.z轴的加速度。 看哪个方向受力。
可以看一下效果。
原理: ios4以前, ios4之后 (包括ios4)
1.获取单例对象
2.设置代理
3设置采样间隔
4实现代理方法
ios4以前:
// 1.获取单例对象
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
// 2.设置代理
accelerometer.delegate=self;
// 3.设置采样间隔
[accelerometersetUpdateInterval:0.3];
- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
}
ios4之后(包括ios4):
coremotion.framework框架。 (加速度升级 加入了陀螺仪)
core motion 不仅能够提供实时的加速度值 和旋转速度值, 更重要的是, 苹果在其中集成了 很多牛逼的算法。
core motion 获取数据的两种方式:push(实时采集所有数据,采集频率高),
pull模式()。
push: 有个对象可以获取当前加速度的值, 一旦值发生变化, 通过block,代理,通知, 向外界推数据。 内部向外的数据。不会错过任何一个数据。
pull: 外界想拿数据, 外界可以从这里主动去拉数据。 别人主动来拿的数据。 需要的时候拉, 错过一些数据。
push:1. 创建一个运动管理者对象。
2. 判断加速计是否可以用。 (最好判断, 以防止加速计不好用的时候,客户不知道)。
if (!self.mgr.isMagnetometerAvailable) {
return;
}
3. 设置采样间隔。
4. 开始采样。采样到数据就会调用handler, handler会在queue中执行。
push :
把数据告诉外界:
if(error)return;
CMMagneticFieldfield = magnetometerData.magneticField;
NSLog(@"x:%f y:%f z:%f", field.x, field.y, field.z);
pull :
开始采集数据。
只获取数据, 但不推送给外界, 外界想要数据, 自己来拿。
直接读取数据就可以。 不需要代理什么的。
accelerometerData---> acceleration-->
{
// 1.获取加速计信息
CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
// 2.获取陀螺仪信息
CMRotationRate rate = self.mgr.gyroData.rotationRate;
NSLog(@"x:%f y:%f z:%f", rate.x, rate.y, rate.z);
}
摇一摇功能。例如摇一摇加好友。
方法1: 摇一摇, 可以判断, 一个x.y.x方向的值 。是一个方法。但是值太大或者太小都不好。 (复杂)
方法2:ios自带的shake api监控的方法 来实现摇一摇。 (简单)
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent*)event
{
NSLog(@"开始摇一摇");
}
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent*)event
{
NSLog(@"摇一摇被取消");
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent*)event
{
NSLog(@"摇一摇停止");
}
使用过程就是在开始motionBegan做一些动画, 结束motionEnded就结束动画然后搜索周边的好友 或者下一首等等。
计步器:
作用:判断当前的楼层, 当前走了多少步。
一受力一停止受力。 结合定位。
你只要摇的话, 是没有位置变动的。 所以没用。
ios8以前
和ios8以后(包括ios 8)
ios8以前
#import <CoreMotion/CoreMotion.h>
CMStepCounter
和ios8以后(包括ios 8)
CMPedometer
// 0.判断计步器是否可用
if (![CMPedometer isStepCountingAvailable]) {
NSLog(@"计步器不可用");
return;
}
// 1.创建计步器对象
// 2.开始计步
UIDynamic
UIDynamics隶属于uikit框架, ios7开始引入的,物理引擎,可以模仿一些重力,弹性碰撞等物理现象。
价值:广泛应用于游戏开发, 经典的案例是“愤怒的小鸟”。
由于有了这个框架, 很好的解决了简单的物理计算。
知名的2D物理引擎。 Box2d, Chipmunk。 如果你具体做这个物理现象的话, 就是要自学相关的物理引擎。
实现步骤:
创建一个物理仿真器(设置仿真范围);
创建物理仿真行为(添加仿真元素);
将物理仿真行为添加到物理仿真器中;开始仿真。
三个概念:1. 物理仿真元素:谁来执行。
2.物理仿真行为:执行什么。 仿真行为?仿真动画?
3.物理仿真器:让元素执行行为。
哪些对象可以做物理仿真元素:任何遵守了UIDynamicItem协议的对象。
UIView, UICollectionViewLayoutAttributes等默认都遵守了协议。
所有的行为都可以组合和单独运行。
// 根据仿真元素创建推动行为
UIPushBehavior
// 创建捕捉行为(快速的移动到这个位置,就是捕捉这个点)
UISnapBehavior
// 注意, 如果想多次执行捕捉行为, 需要在之前移除之前添加的捕捉行为
[self.animator removeAllBehaviors];
// 创建捕捉行为
UISnapBehavior *snapBehavior = [[UISnapBehavior alloc] initWithItem:self.boxView snapToPoint:point];
// 设置振幅
snapBehavior.damping=0.0;(设置量级,代表震动,范围是0.0到1.0之间,0.0弹性最大,1.0的动作最生硬,没有弹性)
// 添加捕捉行为到仿真器
[self.animatoraddBehavior:snapBehavior];
// 创建碰撞行为(根据仿真元素)
UICollisionBehavior
// UICollisionBehaviorModeItems = 1 << 0, // 只碰撞物体, 不碰撞边界(两个掉出边界)
// UICollisionBehaviorModeBoundaries = 1 << 1, // 只碰撞边界, 不碰撞物体(不碰撞,一个到边界拦住)
// UICollisionBehaviorModeEverything = NSUIntegerMax // 什么玩意都碰撞(两个都到边界拦住)
三种办法设置边界:
//其中一种是:
碰撞的边界就是 最右边的延长线。
// 添加碰撞检测边界
//@“line”是标识
[collisionBehavoraddBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(0, 600) toPoint:CGPointMake(self.view.bounds.size.width, 200)];
//代理:
设置碰撞代理来 监听碰撞事件。
如果你想知道碰撞的时间,边界, 两个碰撞的 元素是什么。可以设置一个代理。
// 重力行为
UIGravityBehavior
属性:gravityDirection(重力方向,重力速度), angle(角度), magnitude(量级)。setAngle(角度和量级一起修改)