首页 > 代码库 > iOS_传感器的使用
iOS_传感器的使用
一、距离传感器。
大概解释一下距离传感器的功能:它会根据你和iphone间距离不同做出不同的响应。
[objc] view plain copy
print?
- //打开距离传感器
- [UIDevice currentDevice].proximityMonitoringEnabled = YES;
- //监听距离传感器状态变化通知
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sensorStateChange:)name:UIDeviceProximityStateDidChangeNotification object:nil];
- //传感器距离状态变化后调用的方法
- -(void)sensorStateChange:(NSNotificationCenter *)notification;
- {
- if ([[UIDevice currentDevice] proximityState] == YES) {
- NSLog(@"屏幕黑屏");
- //在此写接近时,要做的操作逻辑代码
- }else{
- NSLog(@"屏幕打开");
- }
- }
运行,将手靠近感应器与离开时的结果:
二、加速计(UIAccelerometer/CoreMotion),也称为重力感应。
UIAccelerometer虽然已经停止更新,但是目前还是有一定数量的应用中使用到了该技术。
下面也就再继续使用UIAccelerometer进行编写了:
[html] view plain copy
print?
- @interface ViewController ()<UIAccelerometerDelegate>
- @property (strong, nonatomic) UILabel *graView;
- @property (assign, nonatomic) UIAccelerationValue speedX;
- @property (assign, nonatomic) UIAccelerationValue speedY;
- @end
- //创建并设置接收加速度通知的时间间隔:1.0/60.0 表示一秒接收60次。次数越多,灵敏度越高。
- UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
- accelerometer.updateInterval = 1.0/60.0;
- //添加代理,开启加速度传感器。若代理设置为空,关闭加速传感器(不用的时候记得关闭)
- accelerometer.delegate = self;
- //创建小滑块
- _graView = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
- _graView.center = self.view.center;
- _graView.backgroundColor = [UIColor orangeColor];
- _graView.text = @"滑块";
- _graView.textAlignment = NSTextAlignmentCenter;
- [self.view addSubview:_graView];
- //代理方法
- - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
- {
- //x、y轴方向的速度加上对应轴方向获得的加速度
- _speedX += acceleration.x;
- _speedY += acceleration.y;
- /**
- * 小方块将要移动到的xy轴坐标.
- * 若posX < 0.0 的时候,posX != 0.0,允许反弹,小方块会一直弹跳
- * 若posX < 10.0时,posX = 10.0,关闭反弹,小方块不会沿着反方向滑动,除非达到一定的加速度
- */
- CGFloat posX = _graView.center.x + _speedX;
- CGFloat posY = _graView.center.y - _speedY;
- //碰撞检测
- if (posX < 0.0) {
- posX = 0.0;
- //碰到屏幕左边以0.4倍的速度反弹
- _speedX *= -0.4;
- }else if(posX > self.view.bounds.size.width){
- posX = self.view.bounds.size.width;
- //碰到屏幕右边以0.4倍的速度反弹
- _speedX *= -0.4;
- }
- if (posY < 0.0) {
- posY = 0.0;
- //碰到屏幕上边不反弹
- _speedY = 0.0;
- }else if (posY > self.view.bounds.size.height){
- posY = self.view.bounds.size.height;
- //碰到屏幕下边以0.8倍的速度反弹
- _speedY *= -0.8;
- }
- //移动小方块
- _graView.center = CGPointMake(posX, posY);
- }
附上模拟器运行截图,不能动的,具体效果见真机吧。亲测可用,灵敏度调高就有点类似摇一摇,但也因为移动定位太快很快就会贴边,不会有逐渐放慢的效果。
三、三轴陀螺仪
声明一个CMMotionManager属性,可用来获取三轴坐标与加速计。
[objc] view plain copy
print?
- @property (strong, nonatomic) CMMotionManager *motionManager;
创建相关对象
[objc] view plain copy
print?
- self.motionManager = [[CMMotionManager alloc] init];
[objc] view plain copy
print?
- NSOperationQueue *queue = [[NSOperationQueue alloc] init];
Ps:我自己又多创建了一个label(_gyroscopeLabel 属性)用来接收相关信息,大家自己创建吧,不列代码了。
用自己创建的label接收三轴坐标信息:
[objc] view plain copy
print?
- //陀螺仪
- if (motionManager.gyroAvailable) {
- motionManager.gyroUpdateInterval = 1.0/10.0;//更新频率
- //后台线程 开始更新
- [motionManager startGyroUpdatesToQueue:queue withHandler:^(CMGyroData *gyroData,NSError *error){
- NSString *labelText;
- if (error) {
- [motionManager stopGyroUpdates];
- labelText = [NSString stringWithFormat:@"错误: %@",error];
- }else{
- labelText = [NSString stringWithFormat:@"陀螺仪-> x:%.2f y:%.2f z:%.2f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData.rotationRate.z];
- }
- [_gyroscopeLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];
- }];
- }else{
- _gyroscopeLabel.text = @"这个设备没有陀螺仪";
- }
刚才说过,也可用来获取加速计(重力感应)
Ps:_accelerometerLabel也是自己另外创建的label,用来接收加速计信息。大家自己另外创建即可。
[objc] view plain copy
print?
- //加速计。这也算是重力感应的另一种实现方法
- if (motionManager.accelerometerAvailable) {
- motionManager.accelerometerUpdateInterval = 1.0/10.0;//更新频率
- //后台线程 开始更新
- [motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData,NSError *error){
- NSString *labelText;
- if (error) {
- [motionManager stopAccelerometerUpdates];
- labelText = [NSString stringWithFormat:@"错误: %@",error];
- }else{
- labelText = [NSString stringWithFormat:@"加速计-> x:%.2f y:%.2f z:%.2f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z];
- }
- [_accelerometerLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];
- }];
- }else{
- _accelerometerLabel.text = @"这个设备没有加速计";
- }
虚拟器运行结果:
真机测试结果:
四、磁力传感器
磁力计的数据也是基于CMMotionManager获取到得。关于CMMotionManager的创建跟三轴陀螺仪一样:
Ps:_directionLabel自己创建的label。
[objc] view plain copy
print?
- CMMotionManager *motionManager = [[CMMotionManager alloc] init];
[objc] view plain copy
print?
- NSOperationQueue *queue = [[NSOperationQueue alloc] init];
- if (motionManager.magnetometerAvailable) {
- motionManager.magnetometerUpdateInterval = 1/10.0;//更新频率
- //后台线程 开始更新
- [motionManager startMagnetometerUpdatesToQueue:queue withHandler:^(CMMagnetometerData *magnetometerData, NSError *error) {
- NSString *labelText;
- if (error) {
- [motionManager stopMagnetometerUpdates];
- labelText = [NSString stringWithFormat:@"错误: %@",error];
- }else{
- labelText = [NSString stringWithFormat:@"磁力计-> x:%.2f y:%.2f z:%.2f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z];
- }
- [_directionLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];
- }];
- }else{
- NSLog(@"设备没有磁力计");
- }
iOS_传感器的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。