一、距离传感器
要想使用传感器首先要打开传感器,把proximitySensingEnabled选为YES。
// 默认情况下,每一个应用程序都可以将自己的距离传感器打开(默认是关闭状态)
// [UIApplication sharedApplication].proximitySensingEnabled = YES;该方法已经过期
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
// 用通知监听物品靠近还是离开
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange:) name:UIDeviceProximityStateDidChangeNotification object:nil];
在方法proximityStateDidChange:里面写点什么看是否监听到
- (void)proximityStateDidChange:(NSNotification *)note
{
if ([UIDevice currentDevice].proximityState) {
NSLog(@"有物品靠近");
} else {
NSLog(@"有物品离开");
}
}
当把手遮住手机和移开手
二、加速计
// 1.获取单例对象
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
// 2.设置代理
accelerometer.delegate = self;
// 3.设置采样间隔
accelerometer.updateInterval = 2.0;
}
设置加速计首先要执行上面代码描述的三个步骤。1.获取单例对象 2.设置代理 3.设置采样的间隔。
接下来将执行代理方法
/**
* 当获取加速计信息会执行该方法
*
* @param acceleration 存储了x/y/z加速度值
*/
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
}
我们设置的加速计每2两秒收集一次代码中设置的就是这个属性updateInterlal。
另外一点值得注意的是加速计反应出来的表现是哪个方向受到了力 ,坐标轴就在哪个方向显示值。上图中为我的手机屏幕朝上平躺在桌面上受到重力的作用时显示的数值。
同时UIAccelerometer已经过期,苹果目前建议使用coreMotion。
三、coreMotion框架的使用
1.要使用coreMotion首先要导入#import <CoreMotion/CoreMotion.h>
下面就来做一个简单的例子
Core Motion获取数据有两种方式 ,一种是push方式:实时采集所有数据(采集频率高),一种是pull方式:在有需要的时候,再主动去采集数据。
2.首先写一个pull方式吧,我们调用陀螺仪和加速计这两个传感器
先声明一个管理者属性,当然是全局的
@property (nonatomic, strong) CMMotionManager *mgr;
同时设置它的懒加载
- (CMMotionManager *)mgr
{
if (_mgr == nil) {
_mgr = [[CMMotionManager alloc] init];
}
return _mgr;
}
- (void)viewDidLoad {
[super viewDidLoad];
// pull
// 1.判断陀螺仪是否可用
if (!self.mgr.isGyroAvailable) {
NSLog(@"陀螺仪不可用");
return;
}
// 2.开始采样
[self.mgr startGyroUpdates];
// [self.mgr startAccelerometerUpdates];
}
当我点击屏幕时获取陀螺仪和加速计反应出来的信息
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 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);
}
我在空中某两个位置分别点了一次。显示信息如图。
3.现在做一个push方式.
push方式与pull相比多了一个采样的环节。
- (void)pushGyro
{
// push
// 1.判断陀螺仪是否可用
if (!self.mgr.isGyroAvailable) {
NSLog(@"陀螺仪不可用");
return;
}
// 2.设置采样间隔
self.mgr.gyroUpdateInterval = 1.0 / 10;
// 3.开始采样
[self.mgr startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData *gyroData, NSError *error) {
if (error) return ;
CMRotationRate rate = gyroData.rotationRate;
NSLog(@"x:%f y:%f z:%f", rate.x, rate.y, rate.z);
}];
}
我们启动陀螺仪传感器,在这里设置的采样频率是每秒采集10次。
四、一些事件处理函数
1.摇一摇
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"用户摇一摇");
}
调用这个函数,只要手机摇一摇就会执行里面的代码。
五、例子
计步器的使用。
// 1.创建计步器对象
CMStepCounter *stepCounter = [[CMStepCounter alloc] init];
// 2.开始计步
// 2.1 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.2 在主队列中执行任务
[stepCounter startStepCountingUpdatesToQueue:queue updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate *timestamp, NSError *error) {
if (error) return;