一、距离传感器
- (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(@"有物品离开 屏幕变亮");
}
}
二、摇一摇
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
//实现3个代理方法即可
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"开始摇一摇");
}
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"摇一摇取消");
}
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"摇一摇结束");
}
三、Core Motion
CMMotionManager 是 Core Motion 库的核心类,负责获取和处理手机的运动信息,它可以获取的数据有:
- 加速度,标识设备在三维空间中的瞬时加速度
- 陀螺仪,标识设备在三个主轴上的瞬时旋转
- 磁场信息,标识设备相对于地球磁场的方位
- 设备运动数据,标识关键的运动相关属性,包括设备用户引起的加速度、姿态、旋转速率、相对于校准磁场的方位以及相对于重力的方位等,这些数据均来自于 Core Motion 的传感器融合算法,从这一个数据接口即可获取以上三种数据,因此使用较为广泛。
CMMotionManager 有 push 和 pull 两种方式获取数据:
- push 方式实时获取数据,采样频率高。
- pull 方式仅在需要数据时采集数据,Apple 更加推荐这种方式获取数据。
1.加速计
作用:检测设备的运动
(1)pull方式
#import "ViewController.h"
//需要导入头文件
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property(nonatomic, strong) CMMotionManager *mgr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1.判断加速计是否可用
self.mgr = [[CMMotionManager alloc]init];
if (!self.mgr.isAccelerometerAvailable) {
NSLog(@"加速计坏了,请更换手机");
return;
}
// 2.开始采样
[self.mgr startAccelerometerUpdates];
}
// 3.点击屏幕开始获取加速计的值
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
}
@end
(2)push方式
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property(nonatomic, strong) CMMotionManager *mgr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1.创建运动管理者
self.mgr = [[CMMotionManager alloc] init];
// 2.判断加速计是否可用
if (!self.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);
}];
}
@end
2.陀螺仪
作用:检测设备的旋转
(1)pull
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property(nonatomic, strong) CMMotionManager *mgr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.mgr = [[CMMotionManager alloc]init];
// 1.判断陀螺仪是否可用
if (!self.mgr.isGyroAvailable) {
NSLog(@"陀螺仪不可用,请更换手机");
return;
}
// 2.开始采样
[self.mgr startGyroUpdates];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
CMRotationRate rate = self.mgr.gyroData.rotationRate;
NSLog(@"x:%f y:%f z:%f", rate.x, rate.y ,rate.z);
}
@end
(2)push
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property(nonatomic, strong) CMMotionManager *mgr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1.创建管理者
self.mgr = [[CMMotionManager alloc] init];
// 2.判断陀螺仪是否可用
if (!self.mgr.isGyroAvailable) {
NSLog(@"陀螺仪不可用,请更换手机");
return;
}
// 3.设置采样间隔
self.mgr.gyroUpdateInterval = 1.0 / 3;
// 4.开始采样
[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);
}];
}
@end
3.计步
需要在info.plist中配置Privacy - Motion Usage Description的权限
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@end
@implementation ViewController
- (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:@"2019-10-22"];
NSDate *toDate = [fmt dateFromString:@"2019-10-29"];
[pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
return;
}
NSLog(@"%@", pedometerData.numberOfSteps);
}];
}
@end
网友评论