介绍几种iOS中常用的传感器,需用真机测试
一 距离传感器
作用:检测是否有物品靠近
应用场景: 打电话时如果贴近耳朵屏幕会自动变暗 微信听别人说的语音时,把手机靠近耳朵屏幕也会自动变暗
代码实现:
- (void)viewDidLoad {
[super viewDidLoad];
// 打开距离传感器
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
// 监听有物品靠近还是离开
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
}
- (void)proximityStateDidChange
{
if ([UIDevice currentDevice].proximityState) {
NSLog(@"有物品靠近 屏幕变暗");
} else {
NSLog(@"有物品离开 屏幕变亮");
}
}
二 加速计
作用:检测设备的运动
应用场景:摇一摇 计步器
加速计原理:根据(X,Y,Z)轴加速度的值判断哪个方向运动或有力的作用
代码实现 需导入CoreMotion框架
两种方式
- pull方式:需要时获取加速计的值
- push方式:实时更新加速计的值
pull 方式
- (void)viewDidLoad {
[super viewDidLoad];
// 1.判断加速计是否可用
if (!self.mgr.isAccelerometerAvailable) {
NSLog(@"加速计坏了,请更换手机");
return;
}
// 2.开始采样
[self.mgr startAccelerometerUpdates];
}
// 3.点击屏幕开始获取加速计的值
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
}
push方式
// 1.创建运动管理者
CMMotionManager *mgr = [[CMMotionManager alloc] init];
// 2.判断加速计是否可用
if (!mgr.isAccelerometerAvailable) {
NSLog(@"加速计不可用");
return;
}
// 3.设置采样间隔
self.mgr.accelerometerUpdateInterval = 1.0;
// 4.开始采样
[self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
// 1.判断获取的过程中是否有错误
if (error) {
NSLog(@"%@", error);
return;
}
// 2.获取加速计的数值
CMAcceleration acceleration = accelerometerData.acceleration;
NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
}];
三 陀螺仪
作用:检测设备的旋转
应用场景:赛车游戏中方向的控制
代码实现:需导入CoreMotion框架
相比于加速计 同样有两种方式(push pull)获取陀螺仪信息
懒加载
- (CMMotionManager *)mgr
{
if (_mgr == nil) {
_mgr = [[CMMotionManager alloc] init];
}
return _mgr;
}
- push 方式
// 1.判断陀螺仪是否可用
if (!self.mgr.isGyroAvailable) {
NSLog(@"陀螺仪不可用,请更换手机");
return;
}
// 2.设置采样间隔
self.mgr.gyroUpdateInterval = 1.0 / 3;
// 3.开始采样
[self.mgr startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
return;
}
// 获取陀螺仪的数值
CMRotationRate rate = gyroData.rotationRate;
NSLog(@"x:%f y:%f z:%f", rate.x, rate.y ,rate.z);
}];
- pull方式
- (void)viewDidLoad {
[super viewDidLoad];
// pull方式
// 1.判断陀螺仪是否可用
if (!self.mgr.isGyroAvailable) {
NSLog(@"陀螺仪不可用,请更换手机");
return;
}
// 2.开始采样
[self.mgr startGyroUpdates];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CMRotationRate rate = self.mgr.gyroData.rotationRate;
NSLog(@"x:%f y:%f z:%f", rate.x, rate.y ,rate.z);
}
三 摇一摇
作用:检测用户是否摇晃了手机
代码实现三个方法即可
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"开始摇一摇");
}
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"摇一摇取消");
}
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"摇一摇结束");
}
四 计步器
作用:检测用户走了多少步
原理:检测设备加速度
苹果提供了两套api iOS7及iOS8的api 用法基本相同
- iOS7用法
// 1.判断计步器是否可用
if (![CMStepCounter isStepCountingAvailable]) {
NSLog(@"计步器不可用");
return;
}
// 2.创建计步器对象
CMStepCounter *stepCounter = [[CMStepCounter alloc] init];
// 3.开始计步
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[stepCounter startStepCountingUpdatesToQueue:queue updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
self.stepLabel.text = [NSString stringWithFormat:@"您一共了%ld步", numberOfSteps];
});
}];
- iOS8用法
- (void)viewDidLoad {
[super viewDidLoad];
// 1.判断计步器是否可用
if (![CMPedometer isStepCountingAvailable]) {
NSLog(@"计步器不可用");
return;
}
// 2.创建计步器对象
CMPedometer *pedometer = [[CMPedometer alloc] init];
// 3.开始计步
[pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
return;
}
NSLog(@"%@", pedometerData.numberOfSteps);
}];
// 4.查询之前走了多少步
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSDate *fromDate = [fmt dateFromString:@"2015-10-22"];
NSDate *toDate = [fmt dateFromString:@"2015-10-29"];
[pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
return;
}
NSLog(@"%@", pedometerData.numberOfSteps);
}];
}