IOS 传感器简单介绍

本文介绍了iOS设备中的距离传感器和加速计的使用,包括如何开启传感器、监听变化以及使用Core Motion框架进行数据采集。还讨论了Core Motion的push和pull两种数据获取方式,并给出了实际应用场景,如摇一摇事件检测和计步器的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、距离传感器

要想使用传感器首先要打开传感器,把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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值