指南针小demo
(1)设置背景图片,设置指南针背景图.
//背景图片UIImageView* backgroundImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"BackGroundPad.png"]];[self.view addSubview:backgroundImage];//创建指南针图片self.compassImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"compass.png"]];self.compassImageView.center = CGPointMake(160 , 240);[self.view addSubview:self.compassImageView];
(2)初始化位置管理器
指南针的使用离不开位置管理器,需要使用CLLocationManager,
<pre name="code" class="objc"> //初始化locationManager并设置代理类self.locationManager = [[CLLocationManager alloc]init];self.locationManager.delegate = self;
如果设备的探测器正常开启,则进行指南针相关设置,否则弹出alertView,进行提示探测器无法使用.代码如下:
if ([CLLocationManager headingAvailable]) {//设置精度self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;//设置滤波器不工作self.locationManager.headingFilter = kCLHeadingFilterNone;//开始更新[self.locationManager startUpdatingHeading];// [self.locationManager startUpdatingLocation];_jiaoDu = [[UILabel alloc] initWithFrame:CGRectMake(140, 320, 60, 30)];_jiaoDu.backgroundColor = [UIColor redColor];_fangXiang = [[UILabel alloc] initWithFrame:CGRectMake(140, 360, 60, 30)];_fangXiang.backgroundColor = [UIColor yellowColor];[self.view addSubview:_jiaoDu];[self.view addSubview:_fangXiang];}else{UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"提示" message:@"传感器不可用" delegate:nil cancelButtonTitle:@"返回" otherButtonTitles: nil];[alert show];}
(3)执行代理方法,实现实时显示数据和方向
//调用locationManager成员方法
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{//重置view的位置self.compassImageView.transform = CGAffineTransformIdentity;CGAffineTransform transform = CGAffineTransformMakeRotation(-1 * M_PI*newHeading.magneticHeading/180.0);self.compassImageView.transform = transform;_jiaoDu.text = [NSString stringWithFormat:@"%0.1f°",newHeading.magneticHeading];_jiaoDu.textColor = [UIColor whiteColor];if ((newHeading.magneticHeading >= 0 && newHeading.magneticHeading <=22 )|| newHeading.magneticHeading > 337) {_fangXiang.text = @"北";// NSLog(@"____________北");}else if (newHeading.magneticHeading > 22 && newHeading.magneticHeading <=67){_fangXiang.text = @"东北";// NSLog(@"____________东北");}else if (newHeading.magneticHeading > 67 && newHeading.magneticHeading <=112){_fangXiang.text = @"东";// NSLog(@"____________东");} else if (newHeading.magneticHeading > 112 && newHeading.magneticHeading <=157) {_fangXiang.text = @"东南";// NSLog(@"____________东南");}else if (newHeading.magneticHeading > 157 && newHeading.magneticHeading <=202){_fangXiang.text = @"南";//NSLog(@"____________南");}else if (newHeading.magneticHeading > 202 && newHeading.magneticHeading <=247){_fangXiang.text = @"西南";//NSLog(@"____________西南");}else if (newHeading.magneticHeading > 247 && newHeading.magneticHeading <=292){_fangXiang.text = @"西";// NSLog(@"____________西");}else{_fangXiang.text = @"西北";// NSLog(@"____________西北");}_fangXiang.textColor = [UIColor whiteColor];_fangXiang.textAlignment = 1;}
(4)程序调试能够正常使用.
备注:
如果您确实需要使用Core Location框架,则务必控制在最小程度,且正确地配置位置服务。收集位置数据需要给主板上的接收装置上电,并向基站、Wi-Fi热点、或者GPS卫星查询,这个过程可能要花几秒钟的时间。此外,请求更高精度的位置数据可能需要让接收装置更长时间地处于打开状态,而长时间地打开这个硬件会耗尽设备的电池。如果位置信息不是频繁变化,通常可以先取得初始位置,然后每隔一段时间请求一次更新就可以了。如果您确实需要定期更新位置信息,也可以为位置服务设置一个最小的距离阈值,从而最小化代码必须处理的位置更新。
取得用户当前位置首先要CLLocationManager
类的实例,并用期望的精度和阈值参数进行配置。开始接收通告则需要为该对象分配一个delegate,然后调用startUpdatingLocation
方法来确定用户当前位置。当新的位置数据到来时,位置管理器会通知它的委托对象。如果位置更新通告已经发送完成,您也可以直接从CLLocationManager
对象获取最新的位置数据,而不需要等待新的事件。