地图定位,是相关application不可或缺的一部分,比如嘀嘀打车,需要地图来查看出租车的位置,在比如百度地图,当我们搜索相关的位置时,地图上会出现相应的(标注)棒棒糖(大多数人叫做大头针,但本人喜欢叫棒棒糖),那如此高端的程序是不是很难呢,其实这个苹果公司可谓将这个功能封装的非常简单了,接下来,用比较简单的实例来看一下地图的应用,作用是 通过地图查看附近的相关微博,程序结果如下
首先是实例化地图组件,MKMapView,需要引用头文件:@import<MapKit/MapKit.h>,可以用storyboard拖也可以用代码写,我是用代码写的,首先导入头文件
#import "ViewController.h" #import <MapKit/MapKit.h> #import "WeiBoManager.h" #import "Token.h" #import "Weibo.h"
接着在延展中定义一个属性,当然就是地图组件
@property(nonatomic,strong)MKMapView * mapView;
申请微博,首先完成管理者里的方法
在头文件中声明一个负责回调申请到的微博的代码块,以及一个获取附近微博的方法
typedef void(^WBM)(NSArray * array);//定义一个Block回调,返回请求的结果
<pre name="code" class="objc">@property(nonatomic,strong)AFHTTPRequestOperationManager * operationManager;//第三方的网络请求组件
/** * 获取某个位置的附近微博 * * @param access_token 用的token值 * @param latitude 纬度值 * @param longtitute 经度值 * @param count 获取数量 * @param b 获取的微博列表 */ -(void)getWeiboNearByTimeLineWithToken:(NSString *)access_token Latitude:(NSString *)latitude Longtitute:(NSString *)longtitute Count:(NSInteger)count BlockHandle:(WBM)b;
/** * 获取某个位置的周边微博 * * @param access_token 用的token值 * @param latitude 纬度值 * @param longtitute 经度值 * @param count 获取数量 * @param b 获取的微博列表 */ -(void)getWeiboNearByTimeLineWithToken:(NSString *)access_token Latitude:(NSString *)latitude Longtitute:(NSString *)longtitute Count:(NSInteger)count BlockHandle:(WBM)b { //创建参数字典 NSDictionary * parameterDict = @{@"access_token":access_token,@"lat":latitude,@"long":longtitute,@"count":[NSString stringWithFormat:@"%ld",count]}; //开始请求 [self.operationManager GET:nearby_timeLine parameters:parameterDict success:^void(AFHTTPRequestOperation * operation, NSData * data) { NSError * error; //创建一个字典接收数据 NSDictionary * resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; //接收数组 NSArray * weiboArray = resultDict[@"statuses"]; //创建一个可变数组,存储最后的结果 NSMutableArray * resultArray = [NSMutableArray array]; //开始遍历,并且添加数据 for (NSDictionary * tempDict in weiboArray) { //创建一个微博模型 Weibo * weibo = [[Weibo alloc]init]; //开始赋值 weibo.userName = tempDict[@"user"][@"name"]; weibo.weiboText = tempDict[@"text"]; //为坐标赋值 NSString * lat = tempDict[@"geo"][@"coordinates"][0]; NSString * longc = tempDict[@"geo"][@"coordinates"][1]; CLLocationCoordinate2D temp = CLLocationCoordinate2DMake([lat doubleValue], [longc doubleValue]); weibo.weiboLocationCoordinate2D = temp; // NSLog(@"位置是:%g,%g",weibo.weiboLocationCoordinate2D.latitude,weibo.weiboLocationCoordinate2D.longitude); //添加到可变数组 [resultArray addObject:weibo]; } //回调 b([NSArray arrayWithArray:resultArray]); } failure:^void(AFHTTPRequestOperation * operation, NSError * error) { ; }]; }
初始化微博Manager单例以及地图组件
//初始化地图视图 self.mapView = [[MKMapView alloc]initWithFrame:self.view.frame]; //初始化单例 self.weiboManager = [WeiBoManager shareWeiBoManager];
//创建一个传参结构体(region) MKCoordinateRegion myRegion ; //设置纬度 myRegion.center.latitude = 39 + 54.0 / 60 + 24.15 / 60 / 60;//纬度 myRegion.center.longitude = 116 + 23.0 / 60 + 29.22 / 60 / 60;//经度 //设置span(跨度) myRegion.span.latitudeDelta = 0.1;//纬度跨度为10km,单位是度,1度大约表示1100km myRegion.span.longitudeDelta = 0.1;//经度跨度为10km //设置起点属性 self.mapView.region = myRegion;
//避免强引用循环 __block __weak ViewController * copy_self = self; //请求数据 [self.weiboManager getWeiboNearByTimeLineWithToken:token Latitude:[NSString stringWithFormat:@"%lf",myRegion.center.latitude] Longtitute:[NSString stringWithFormat:@"%lf",myRegion.center.longitude] Count:3 BlockHandle:^(NSArray *array) { //将数据添加到mapView上 [copy_self.mapView addAnnotations:array]; }]; //添加视图 [self.view addSubview:self.mapView];
// // Weibo.h // 新浪微博-地图版 // // Created by YueWen on 15/9/28. // Copyright (c) 2015年 YueWen. All rights reserved. // #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface Weibo : NSObject<MKAnnotation>//首先履行一个协议 /** * 发送者的名字 */ @property(nonatomic,strong)NSString * userName; /** * 发送者的微博信息 */ @property(nonatomic,strong)NSString * weiboText; /** * 发送微博的位置 */ @property(nonatomic,assign)CLLocationCoordinate2D weiboLocationCoordinate2D; @end
-(CLLocationCoordinate2D)coordinate { return self.weiboLocationCoordinate2D; } -(NSString *)title { return self.userName; } -(NSString *)subtitle { return self.weiboText; }
数据类以及模型类基本写完,这样基本功能就可以实现了。
如果觉得棒棒糖不好看。也可以自定义图片,不过还是需要履行一个协议,别忘了在viewDidLoad中设置委托对象
@interface ViewController ()<MKMapViewDelegate>
#pragma mark - MKMapViewDelegate /** * 自定义标注视图 * * @param mapView 当前的mapView * @param annotation 标注的信息 * * @return 自定义的标注视图 */ -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { //从缓冲区中查找使用重用标识符为@“mp”的标注view MKAnnotationView * annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"mp"]; //如果缓冲区中不存在 if (annotationView == nil) { //创建一个重用标识符为@“mp”的标注view annotationView = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"mp"]; } //可以点击显示 annotationView.canShowCallout = YES; //创建一个UIImageView UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)]; imageView.image = [UIImage imageNamed:@"头像"]; //设置头像 annotationView.leftCalloutAccessoryView = imageView; //代替棒棒糖的图,图的大小建议找个合适的,不然看起来有点不匹配 annotationView.image = [UIImage imageNamed:@"11"]; return annotationView; }
基本功能就此已经实现。