手机传感器
2016-06-12 本文已影响79人
lee_moons
距离传感器
- (void)viewDidLoad {
[super viewDidLoad];
// 打开距离传感器 默认是关闭的
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
// 判断距离传感器是否打开
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChangeNotification) name:UIDeviceProximityStateDidChangeNotification object:nil];
}
// 当距离传感器状态改变时调用
- (void)proximityStateDidChangeNotification
{
if ([UIDevice currentDevice].proximityState == YES) {
NSLog(@"靠近了");
}else{
NSLog(@"离开了");
}
}
CoreMotion
导入CoreMotion框架
1.加速计 A
2.磁力计 M
3.陀螺仪 G
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
// 管理者
@property (nonatomic, strong) CMMotionManager *motionManager;
@end
创建管理者
self.motionManager = [[CMMotionManager alloc] init];
// 判断硬件是否可用
// 1.加速计 A
if (self.motionManager.accelerometerAvailable == NO) {
NSLog(@"加速计不可用");
}
// 在使用时才获取数据
// 开始采集加速计数据
[self.motionManager startAccelerometerUpdates];
[self accelerometerPush];
// 2.磁力计 M
if (self.motionManager.magnetometerData == NO) {
NSLog(@"磁力计不可用");
}
[self.motionManager startMagnetometerUpdates];
[self gyroPush];
// 3.陀螺仪 G
if (self.motionManager.gyroAvailable == NO) {
NSLog(@"陀螺仪不可用");
}
[self.motionManager startGyroUpdates];
[self magnetometerPush];
加速器push方法
- (void)accelerometerPush
{
// 一直推送数据
// 设置采集数据的频率
self.motionManager.accelerometerUpdateInterval = 1;
// 采集数据
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
// 打印错误
if (error) {
NSLog(@"%@",error);
}
// 1:受到了一个重力的作用
NSLog(@"x: %f y : %f z : %f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
}];
}
磁力计push方法
- (void)magnetometerPush
{
// 设置更新频率
self.motionManager.gyroUpdateInterval = 1;
// push方式
[self.motionManager startMagnetometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
}
// 单位:特斯拉
NSLog(@"x : %f y : %f z : %f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z);
}];
}
陀螺仪push方法
- (void)gyroPush
{
// 设置更新频率
self.motionManager.gyroUpdateInterval = 1;
// 开始采集数据
[self.motionManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
}
NSLog(@"x : %f y : %f z : %f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData.rotationRate.z);
}];
}
计步器
导入CoreMotion框架
导入头文件,设置属性
设置iOS8之前的计步器
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *stepLabel;
@property (nonatomic, strong) CMStepCounter *stepCounter;
@end
// 判断计步器是否可用
if (![CMStepCounter isStepCountingAvailable]) {
NSLog(@"计步器不可用");
}
// 创建计步器对象
self.stepCounter = [[CMStepCounter alloc] init];
// 开始计步
// updateOn:从几步开始显示数据
[self.stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
}
self.stepLabel.text = [NSString stringWithFormat:@"%zd",numberOfSteps];
}];
iOS8之后的计步器
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property (nonatomic, strong) CMPedometer *pedometer;
@end
// 1.判断计步器是否可用
if (![CMPedometer isStepCountingAvailable]) {
NSLog(@"计步器不可用");
}
// 2.创建计步器对象
self.pedometer = [[CMPedometer alloc] init];
// 3.开始计步
// FromDate 从哪个时间开始计步
[self.pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
}
NSLog(@"%@",pedometerData.numberOfSteps);
}];
摇一摇操作
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"开始摇");
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"结束摇");
}
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"取消");
}
加速器使用之小球运动
导入头文件 导入框架CoreMotion
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *ballView;
@property (nonatomic, strong) CMMotionManager *motionManager;
// 小球的速度
@property (nonatomic, assign) CGPoint speed;
@end
设置小球
// 创建管理者
self.motionManager = [[CMMotionManager alloc] init];
// 判断硬件是否可用
if (self.motionManager.isAccelerometerAvailable == NO) {
NSLog(@"加速计不可用");
}
// push方式
// 设置更新频率
self.motionManager.accelerometerUpdateInterval = 1 / 30.0;
// 开始采集数据
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
}
// 加速度 -->速度 -->距离(位置)
NSLog(@"x %f y %f",accelerometerData.acceleration.x,accelerometerData.acceleration.y);
// 目标:改变小球的位置 -->x和y
// 1.速度
_speed.x += accelerometerData.acceleration.x;
_speed.y -= accelerometerData.acceleration.y;
CGRect ballViewFrame = self.ballView.frame;
// 2.小球要移动的距离
// 3.改变小球的frame
ballViewFrame.origin.x += _speed.x;
ballViewFrame.origin.y += _speed.y;
// 屏幕左边
if (ballViewFrame.origin.x < 0) {
ballViewFrame.origin.x = 0;
// 让小球弹起来
// 0.8 :让小球加一个阻力效果
_speed.x *= -0.8;
}
// 屏幕右边
if (ballViewFrame.origin.x > self.view.bounds.size.width - self.ballView.frame.size.width) {
ballViewFrame.origin.x = self.view.bounds.size.width - self.ballView.frame.size.width;
_speed.x *= -0.8;
}
// 屏幕上边
if (ballViewFrame.origin.y < 0) {
ballViewFrame.origin.y = 0;
_speed.y *= -0.8;
}
// 屏幕下边
if (ballViewFrame.origin.y > self.view.bounds.size.height - self.ballView.frame.size.height) {
ballViewFrame.origin.y = self.view.bounds.size.height - self.ballView.frame.size.height;
_speed.y *= -0.8;
}
// 4.给小球位置赋值
self.ballView.frame = ballViewFrame;
}];