天天看點

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. }      

繼續閱讀