天天看点

iOS_传感器的使用

一、距离传感器。

大概解释一下距离传感器的功能:它会根据你和iphone间距离不同做出不同的响应。

[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. //打开距离传感器
2. [UIDevice.proximityMonitoringEnabled = YES;
3. //监听距离传感器状态变化通知
4. [[NSNotificationCenterself@selector(sensorStateChange:)name:UIDeviceProximityStateDidChangeNotification:nil];
5. //传感器距离状态变化后调用的方法
6. -(void)sensorStateChange:(NSNotificationCenter *)notification;
7. {
8. if ([[UIDeviceYES) {
9. @"屏幕黑屏");
10. //在此写接近时,要做的操作逻辑代码
11. 
12. else{
13. @"屏幕打开");
14. }
15. }      

运行,将手靠近感应器与离开时的结果:

iOS_传感器的使用

二、加速计(UIAccelerometer/CoreMotion),也称为重力感应。

UIAccelerometer虽然已经停止更新,但是目前还是有一定数量的应用中使用到了该技术。

下面也就再继续使用UIAccelerometer进行编写了:

[html] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. @interface ViewController ()<UIAccelerometerDelegate>
2. @property (strong, nonatomic) UILabel *graView;
3. @property (assign, nonatomic) UIAccelerationValue speedX;
4. @property (assign, nonatomic) UIAccelerationValue speedY;
5. @end
6. 
7. //创建并设置接收加速度通知的时间间隔:1.0/60.0 表示一秒接收60次。次数越多,灵敏度越高。
8. accelerometer = [UIAccelerometer sharedAccelerometer];
9. accelerometer.updateInterval = 1.0/60.0;
10. //添加代理,开启加速度传感器。若代理设置为空,关闭加速传感器(不用的时候记得关闭)
11. accelerometer.delegate = self;
12. //创建小滑块
13. _graView = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
14. _graView.center = self.view.center;
15. _graView.backgroundColor = [UIColor orangeColor];
16. _graView.text = @"滑块";
17. _graView.textAlignment = NSTextAlignmentCenter;
18. [self.view addSubview:_graView];
19. 
20. //代理方法
21. - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
22. {
23. //x、y轴方向的速度加上对应轴方向获得的加速度
24. _speedX += acceleration.x;
25. _speedY += acceleration.y;
26. 
27. /**
28. *  小方块将要移动到的xy轴坐标.
29. < 0.0 的时候,posX != 0.0,允许反弹,小方块会一直弹跳
30. < 10.0时,posX = 10.0,关闭反弹,小方块不会沿着反方向滑动,除非达到一定的加速度
31. */
32. posX = _graView.center.x + _speedX;
33. posY = _graView.center.y - _speedY;
34. //碰撞检测
35. < 0.0) {
36. posX = 0.0;
37. //碰到屏幕左边以0.4倍的速度反弹
38. _speedX *= -0.4;
39. > self.view.bounds.size.width){
40. posX = self.view.bounds.size.width;
41. //碰到屏幕右边以0.4倍的速度反弹
42. _speedX *= -0.4;
43. }
44. < 0.0) {
45. posY = 0.0;
46. //碰到屏幕上边不反弹
47. _speedY = 0.0;
48. > self.view.bounds.size.height){
49. posY = self.view.bounds.size.height;
50. //碰到屏幕下边以0.8倍的速度反弹
51. _speedY *= -0.8;
52. }
53. //移动小方块
54. _graView.center = CGPointMake(posX, posY);
55. }      

附上模拟器运行截图,不能动的,具体效果见真机吧。亲测可用,灵敏度调高就有点类似摇一摇,但也因为移动定位太快很快就会贴边,不会有逐渐放慢的效果。

iOS_传感器的使用

三、三轴陀螺仪

声明一个CMMotionManager属性,可用来获取三轴坐标与加速计。

[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. @property (strong, nonatomic) CMMotionManager *motionManager;

创建相关对象      
[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. self.motionManager = [[CMMotionManager init];      
[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. NSOperationQueue *queue = [[NSOperationQueue init];      

Ps:我自己又多创建了一个label(_gyroscopeLabel 属性)用来接收相关信息,大家自己创建吧,不列代码了。

用自己创建的label接收三轴坐标信息:

[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. //陀螺仪
2. if (motionManager.gyroAvailable) {
3. .gyroUpdateInterval = 1.0/10.0;//更新频率
4. //后台线程 开始更新
5. CMGyroData *gyroData,NSError *error){
6. NSString *labelText;
7. if (error) {
8. stopGyroUpdates];
9. @"错误: %@",error];
10. else{
11. @"陀螺仪-> x:%.2f y:%.2f z:%.2f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData.rotationRate.z];
12. }
13. @selector(setText:)NO];
14. }];
15. }else{
16. .text = @"这个设备没有陀螺仪";
17. }      

刚才说过,也可用来获取加速计(重力感应)

Ps:_accelerometerLabel也是自己另外创建的label,用来接收加速计信息。大家自己另外创建即可。

[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. //加速计。这也算是重力感应的另一种实现方法
2. if (motionManager.accelerometerAvailable) {
3. .accelerometerUpdateInterval = 1.0/10.0;//更新频率
4. //后台线程 开始更新
5. CMAccelerometerData *accelerometerData,NSError *error){
6. NSString *labelText;
7. if (error) {
8. stopAccelerometerUpdates];
9. @"错误: %@",error];
10. else{
11. @"加速计-> x:%.2f y:%.2f z:%.2f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z];
12. }
13. @selector(setText:)NO];
14. }];
15. }else{
16. .text = @"这个设备没有加速计";
17. }      

虚拟器运行结果:

iOS_传感器的使用

真机测试结果:

iOS_传感器的使用

四、磁力传感器

磁力计的数据也是基于CMMotionManager获取到得。关于CMMotionManager的创建跟三轴陀螺仪一样:

[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. CMMotionManager *motionManager = [[CMMotionManager init];      
[objc] ​​view plain​​​ ​​copy​​

 ​​print​​​​?​​
1. NSOperationQueue *queue = [[NSOperationQueue init];
2. if (motionManager.magnetometerAvailable) {
3. .magnetometerUpdateInterval = 1/10.0;//更新频率
4. //后台线程 开始更新
5. CMMagnetometerData *magnetometerData, NSError *error) {
6. NSString *labelText;
7. if (error) {
8. stopMagnetometerUpdates];
9. @"错误: %@",error];
10. else{
11. @"磁力计-> x:%.2f y:%.2f z:%.2f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z];
12. }
13. @selector(setText:)NO];
14. }];
15. }else{
16. @"设备没有磁力计");
17. }      

继续阅读