- 加速计 陀螺仪 磁力计 距离传感器 计步器 摇一摇
- 传感器是一种感应 检测装置
- 作用:用于感应 检测设备周边信息
在地图应用中,能判断出手机头面向的方向
一关灯,iphone会自动降低亮度,让屏幕显得不是那么刺眼
打电话时,人脸贴近iPhone屏幕时,屏幕会自动锁屏,达到省电的目的
- iphone5内置传感器:
运动传感器 加速度传感器
环境光传感器 :感应周边环境光线的强弱(自动调节屏幕亮度)
距离传感器:感应是否有其他物体靠近设备屏幕(打电话自动锁屏)
磁力计传感器:感应周边的磁场(盒盖锁屏)
内部温度传感器:感应设备内部的温度(提醒用户降温,防止设备损伤)
湿度传感器:感应设备是否进水(方便维护人员)
陀螺仪:感应设备的持握方式(赛车类游戏)
加速计:感应设备的运动(摇一摇,计步器)
气压传感器:测量大气压的气压计(测算海拔高度)iphone6新增
摇一摇
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"开始摇手机");
}
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"结束摇手机");
}
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"取消");
}
距离传感器
//打开距离传感器(默认是关闭)
[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框架的使用
加速计(Accelerometer)
//导入框架
CoreMotion.framework
//导入头文件
#import
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
//1.创建运动管理者
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.manager = manager;
//2.判断加速计是否可用
if(self.manager.isAccelerometerAvailable == NO){
NSLog(@"加速计不可用");
}
//3.获取加速计数据
//push方式
//设置数据的更新频率
self.manager.accelerometerUpdateInterval = 1.0;
//获取数据
[self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
if(error){
NSLog(@"%@",error);
}
//1表示一个重力加速度 g
NSLog(@"x:%f y:%f z:%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
}];
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//------------------------------------------------------------
//1.创建运动管理者
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.manager = manager;
//2.判断加速计是否可用
if(self.manager.isAccelerometerAvailable == NO){
NSLog(@"加速计不可用");
}
//3.开始获取加速计更新数据
[self.manager startAccelerometerUpdates];
//pull方式
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"x:%f y:%f z:%f",self.manager.accelerometerData.acceleration.x,self.manager.accelerometerData.acceleration.y,self.manager.accelerometerData.acceleration.z);
}
磁力计(Magnetometer)
//导入框架
CoreMotion.framework
//导入头文件
#import
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
//1.创建运动管理者
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.manager = manager;
//2.判断磁力计是否可用
if(self.manager.isMagnetometerAvailable == NO){
NSLog(@"磁力计不可用");
}
//3.获取磁力计数据
//push方式
//设置数据更新频率
self.manager.magnetometerUpdateInterval = 1.0;
[self.manager startMagnetometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
if(error){
NSLog(@"%@",error);
}
//磁力计的单位:T 特斯拉
NSLog(@"x:%f y:%f z:%f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z);
}];
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
//1.创建运动管理者
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.manager = manager;
//2.判断磁力计是否可用
if(self.manager.isMagnetometerAvailable == NO){
NSLog(@"磁力计不可用");
}
//3.获取磁力计数据
[self.manager startMagnetometerUpdates];
//pull方式
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"x:%f y:%f z:%f",self.manager.magnetometerData.magneticField.x,self.manager.magnetometerData.magneticField.y,self.manager.magnetometerData.magneticField.z);
}
陀螺仪(Gyro)
//导入框架
CoreMotion.framework
//导入头文件
#import
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
//1.创建运动管理者
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.manager = manager;
//2.判断陀螺仪是否可用
if(self.manager.isGyroAvailable == NO) {
NSLog(@"陀螺仪不可用");
}
//设置更新频率
self.manager.gyroUpdateInterval = 1.0;
//获取数据
[self.manager 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);
}];
//运动管理者
@property (nonatomic,strong)CMMotionManager *manager;
//-----------------------------------------------------------
//1.创建运动管理者
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.manager = manager;
//2.判断陀螺仪是否可用
if(self.manager.isGyroAvailable == NO) {
NSLog(@"陀螺仪不可用");
}
//获取数据
[self.manager startGyroUpdates];
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"x:%f y:%f z:%f",self.manager.gyroData.rotationRate.x,self.manager.gyroData.rotationRate.y,self.manager.gyroData.rotationRate.z);
}
计步器的使用(CMStepCounter CMPedometer)
//导入框架
CoreMotion.framework
//导入头文件
#import
//计算步数
@property(nonatomic,strong)CMStepCounter *stepCounter;
//-------------------------------------------------------------
//1.判断计步器是否可用
if(!CMStepCounter.isStepCountingAvailable){
NSLog(@"计步器不可用");
}
//2.创建计算步数对象
self.stepCounter = [[CMStepCounter alloc] init];
//授权 info.plist NSMotionUsageDescription
//3.开始计算步数
//Queue:队列
//updateOn:从几步开始计算步数
[self.stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:1 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
if(error){
NSLog(@"%@",error);
}
self.stepLabel.text = [NSString stringWithFormat:@"%zd",numberOfSteps];
}];
//计算步数授权
NSMotionUsageDescription
//导入框架
CoreMotion.framework
//导入头文件
#import
//iOS8之后计算步数
@property(nonatomic,strong)CMPedometer *pedometer;
//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);
}];
//计算步数授权
NSMotionUsageDescription
小球运动(传感器应用)
//导入框架
CoreMotion.framework
//导入头文件
#import
//运动管理者
@property(nonatomic,strong)CMMotionManager *motionManager;
//速度
@property(nonatomic,assign)CGPoint spend;
//小球
@property (weak, nonatomic) IBOutlet UIImageView *ballView;
//-----------------------------------------------------------
//1.创建运动管理者对象
self.motionManager = [[CMMotionManager alloc] init];
//2.判断加速计是否可用
if(self.motionManager.isAccelerometerAvailable == NO){
NSLog(@"加速计不可用");
}
//设置跟新时间
self.motionManager.accelerometerUpdateInterval = 1/30.0;
//3.获取加速计数据
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
if(error){
NSLog(@"加速度获取失败");
}
//在这个block中,时间是固定的,并且一段时间就会调用这个block
NSLog(@"x:%f y:%f z:%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
//x y 是x轴和y轴的加速度
//将加速度转换成速度
_spend.x += accelerometerData.acceleration.x;
_spend.y -= accelerometerData.acceleration.y;
//改变小球的位置
CGRect ballFrame = self.ballView.frame;
ballFrame.origin.x += _spend.x;
ballFrame.origin.y += _spend.y;
//防止小球超出四个边界
//左边
if(ballFrame.origin.x <= 0){
ballFrame.origin.x = 0;
//添加空气阻力效果
_spend.x *= -0.7;
}
//右边
if(ballFrame.origin.x >= self.view.bounds.size.width - ballFrame.size.width){
ballFrame.origin.x = self.view.bounds.size.width - ballFrame.size.width;
_spend.x *= -0.7;
}
//上边
if(ballFrame.origin.y <= 0){
ballFrame.origin.y = 0;
_spend.y *= -0.7;
}
//下边
if(ballFrame.origin.y >= self.view.bounds.size.height - ballFrame.size.height){
ballFrame.origin.y = self.view.bounds.size.height - ballFrame.size.height;
_spend.y *= -0.7;
}
//改变frame
self.ballView.frame = ballFrame;
}];