作品链接:
http://www.jianshu.com/users/1e0f5e6f73f6/top_articles
1.距离传感器
一.距离传感器的介绍
- 距离传感器主要是检测是否有物品靠近
- 默认情况下距离传感器是关闭状态,只需要打开即可
二.距离传感器代码的实现
- 打开距离传感器
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
- 监听是有物品靠近还是离开
// 监听有物品靠近还是离开
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
- (void)proximityStateDidChange
{
if ([UIDevice currentDevice].proximityState) {
NSLog(@"有物品靠近");
} else {
NSLog(@"有物品离开");
}
}
2.加速计
一.加速计的介绍
- 加速计的作用:用于检测设备的运动(比如摇晃)
- 加速计的经典应用场景
- 摇一摇
- 计步器
- 加速计的原理
- 检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用,哪个方向运动了)
- 根据加速度数值,就可以判断出在各个方向上的作用力度
二.获取加速计的值
1.旧的API获取
- 在iOS4以前:使用UIAccelerometer,用法非常简单(到了iOS5就已经过期)
2.代码实现
- (void)viewDidLoad {
[super viewDidLoad];
// 1.获取 的对象
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
// 2.设置代理 遵守代理协议UIAccelerometerDelegate
accelerometer.delegate = self;
// 3.设置采样间隔
accelerometer.updateInterval = 0.2;
}
#pragma mark - UIAccelerometerDelegate方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
}
2.新的API获取
- 从iOS4开始,苹果专门封装了一个和运动相关的框架:CoreMotion框架
- 可以通过该框架来获取加速计的数值
- 获取加速计也有两种方式
-
push方式:实时采集所有数据(采集频率高)
- 创建运动管理者对象
- 判断加速计是否可用
- 设置采样间隔
- 开始采集数据
pull方式:在有需要的时候,再主动去采集数据
创建运动管理者对象
判断加速计是否可用
开始采样
需要时通过运动管理者去获取数据
-
代码实现
1.导入第三方框架
#import
2.创建运动管理者并懒加载
/** 运动管理者对象 */
@property (nonatomic, strong) CMMotionManager *manager;
#pragma mark - 懒加载
- (CMMotionManager *)manager
{
if (_manager == nil) {
_manager = [[CMMotionManager alloc] init];
}
return _manager;
}
3.push方式的代码实现
// 1.判断加速计是否可用
if (!self.manager.isAccelerometerAvailable) {
NSLog(@"加速计不可用,请跟换手机");
return;
}
// 2.设置采样间隔
self.manager.accelerometerUpdateInterval = 0.5;
// 3.开始采集数据
[self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
return ;
}
CMAcceleration acceleration = accelerometerData.acceleration;
NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
}];
4.pull方式的代码实现
// 1.判断加速计是否可用
if (!self.manager.isAccelerometerAvailable) {
NSLog(@"加速计不可用,请跟换手机");
return;
}
// 2.开始采集数据
[self.manager startAccelerometerUpdates];
CMAcceleration acceleration = self.manager.accelerometerData.acceleration;
NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
3.陀螺仪
一.陀螺仪的介绍
- 陀螺仪主要用于检测设备的旋转
- 应用场景:游戏中
二.陀螺仪信息的获取
通过CoreMotion框架来获取
-
两种方式来获取
-
push方式
- 创建运动管理者
- 判断陀螺仪是否可用
- 设置采样间隔
- 开始采样
-
pull方式
- 创建运动管理
- 判断陀螺仪是否可用
- 开始采样
- 在需要时通过运动管理获取数值
-
代码实现
1.导入第三方框架
#import
2.创建运动管理者并懒加载
/** 运动管理者对象 */
@property (nonatomic, strong) CMMotionManager *manager;
#pragma mark - 懒加载
- (CMMotionManager *)manager
{
if (_manager == nil) {
_manager = [[CMMotionManager alloc] init];
}
return _manager;
}
```
3.push方式的代码实现
```
// 1.判断陀螺仪是否可以用
if (!self.manager.isGyroAvailable) {
NSLog(@"");
return;
}
// 2.设置采样间隔
self.manager.gyroUpdateInterval = 0.2;
// 3.开始采样
[self.manager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
}
CMRotationRate rate = gyroData.rotationRate;
NSLog(@"x:%f-y:%f-z:%f",rate.x, rate.y, rate.z);
```
4.pull方式代码的实现
```
// 1.判断陀螺仪是否可以用
if (!self.manager.isGyroAvailable) {
NSLog(@"");
return;
}
// 2.开始采样
[self.manager startGyroUpdates];
CMRotationRate rate = self.manager.gyroData.rotationRate;
NSLog(@"x:%f-y:%f-z:%f",rate.x, rate.y, rate.z);
```
---------------------------------------------------
# 4.摇一摇
- 监听用户是否摇晃了手机
- iOS自带的Shake监控API
```
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 检测到摇动 */
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动取消(被中断) */
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动结束 */
```
----------------------------------------------------
# 5.计步器
## 一.计步器的介绍
- 主要用来统计用户行走的步数
## 二.计步器的实现
- 计步器的API封装在了CoreMotion框架中
- iOS7时使用CoreMotion框架中的CMStepCounter
- iOS8时使用CoreMotion框架中的CMPedometer
##### 代码实现
- iOS7
```
// 1.判断计步器是否可以用
if (![CMStepCounter isStepCountingAvailable]) {
NSLog(@"计步器不可用");
return;
}
// 2.创建计步器
CMStepCounter *stepCounter = [[CMStepCounter alloc] init];
// 3.开始计步
[stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
}
NSLog(@"%ld",numberOfSteps);
}];
```
- iOS8
```
// 1.判断计步器是否可用
if (![CMPedometer isStepCountingAvailable]) {
NSLog(@"计步器不可用");
return;
}
// 2.创建计步器
self.pedometer = [[CMPedometer alloc] init];
// 3.开始计步
[self.pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
return;
}
NSLog(@"%@",pedometerData.numberOfSteps);
}];
// 3.查询前几天走了多少步 (最多查询7天)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
NSDate *fromDate = [formatter dateFromString:@"2016-09-07"];
NSDate *toDate = [formatter dateFromString:@"2016-09-09"];
[self.pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
return ;
}
NSLog(@"%@",pedometerData.numberOfSteps);
}];
```