解决方案:
1.首先在工程中创建一个继承UiViewController的 地图类; 然后再SB中拖出一个视图并与SB关联 并拖出地图的控件并右键将协议连接到当前界面
2.在系统工程当中添加mapKIt包, 并在类的.m中导入这个包; 并将 地图控件与.m关联;
3.第三步 比较重要,前两部是搭建界面, 第三步是需要解析出要用的精度和纬度, 注意解析类的实现,同时需要在接口API代码中实现方法 并调用新增的解析类
3.在页面中UiViewController同时将ud里的city信息取出,这样就可以根据首页城市信息,显示周边的城市信息与首页城市信息一致。
4.通过API取出的经纬信息通过数据接收, 接收后遍历数组 ,遍历对象,然后拿到每一个对象对应的大头针
5.但是现在没有大头针对象,需要创建大头针类 继承NSOBJECT ,创建出来后,.h要继承mapKit,并且遵守协议MKAnnotation而且要实现协力里的必须的声明;
6.还需要创建一个自定义的MyAnnotationView 继承MKAnnotationView;
然后再自定义的View里面写上初始化方法(打INIT 然后改) 然后再方法中设置显示图片
7.然后需要在MAPController中实现协议方法MKmapDelegate 里面的viewForAnnotation200行左右
这里要做的实情是,先导入自定义的myAnnotationView, 然后在方法中 创建自定义的myAnnotationView mapview deq 出现警告 需要强转
如果没有av创建
8.当选中大头针以后跳转到详情界面
1.搭建界面, 在界面中添加一个ViewController ,创建MapViewController 并且在storyBoard中与控件关联,在storyboard中拖出一个地图控件,并在
MapViewController中.m中声明好,在storyboard中将地图控件关联自身的delegate。
2.创建类: 需要创建一个bussness类,里面声明的属性就是与解析相关的,如下, 同时实现解析类。并在bussness类中加入地图包;
@property (nonatomic, copy)NSString *path;
@property (nonatomic)CLLocationCoordinate2Dcoord;
3.创建MyAnnotation类:这是自定义的类,同样加入地图包,并添加<MKAnnotation>协议,实现协议里的必须属性 继承NSObject;
@property (nonatomic) CLLocationCoordinate2Dcoordinate;
@property (nonatomic,strong)Business * business; //这个后期实现点击效果的时候会用到;
4.创建这个类 继承后面的MyAnnotationView : MKAnnotationView 并在其中实现初始化方法
- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString*)reuseIdentifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self) {
self.image = [UIImage imageNamed:@"index_map"];
// 通过调用 使大头针的属性更改
// MyAnnotation *ann = annotation;
//
// Business *b = ann.business;
//
// NSData *data = [NSDatadataWithContentsOfURL:[NSURL URLWithString:b.img]];
// self.image = [UIImageimageWithData:data];
//
// self.bounds = CGRectMake(0, 0, 50,50);
}
return self;
}
5.以上创建类,搭建界面的工作都做完后,就需要在viewController里面实现具体的功能了;
5.1因为周边地图的显示是根据,城市信息相关的,而上一个搜索功能实现的时候就已经用了一个轻量级存数据的 nsuserdefault实现过了,所以这里需要声明一个可变字典 来继续设置城市信息,然后最终调用API接口方法,返回数据源数组。 相关代码如下;
NSMutableDictionary*dic = [NSMutableDictionary dictionary];
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[dic setObject:[ud objectForKey:@"city"] forKey:@"city"];
NSArray * businesses = [DianpingApi requestBusinessesWithParamsDaTouZhen:dic];
5.2 拿到了数据源数组就需要进行遍历了 其中下面的代码是解析类中实现好的代码 , 通过下面的代码 和下下的代码就可以清楚 精度纬度是怎么来的了,因为已经解析好了; 下面的解析类代码方便我们理解3中代码的意思
Business *b = [[Business alloc]init];
b.name = [[businessDic objectForKey:@"name"]componentsSeparatedByString:@"("][0];
CLLocationCoordinate2Dcoord;
coord.longitude =[[businessDic objectForKey:@"longitude"]floatValue];
coord.latitude =[[businessDic objectForKey:@"latitude"]floatValue];
b.coord = coord;
下面这段代码与1相关,直接写在1后面
for (Business *b in businesses) {
if (b.coord.latitude > 200) { //大于200是因为这里的错误数据存在经纬度为300的情况 经纬度一般都不是200
continue; //所以当经度大于200的时候 跳出当前循环,继续执行下面的代码
}
通过创建对象
MyAnnotation *ann = [[MyAnnotation alloc]init]; annotation用来显示由一个经纬度定义的位置
ann.coordinate = b.coord; //b.coord里面存放的是解析出来具体对象的经纬度数据;
将这个数据传递给自定义的ann的coordinate属性中记录下来
ann.business = b; //这段代码是为4中代码服务的,意思就是将遍历出来的对象 赋值给ann中声明的business属性 后期会用到。
[self.mapView addAnnotation:ann]; //将自定义的ann加入到视图中
//这句话是直接设置地图的显示缩放大小,并且定位到具体的商户对象的经纬度上。
[self.mapView setRegion:MKCoordinateRegionMake(b.coord, MKCoordinateSpanMake(.1, .1))];
}
6.这段代码的意思就是在地图的view中 显示出自己自定义的大头针地图 图像; 相关实现很简单, 别忘了强转。 标识目前不知道能用在哪里;
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
MyAnnotationView *av = (MyAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"ann"];
if (!av) {
av = [[MyAnnotationView alloc]initWithAnnotation:annotationreuseIdentifier:@"ann"];
}
return av;
}
7.最后一步 也就是实现跳转效果:点击大头针跳转到具体的商户信息上 其中前两句话很重要 需要在MyAnnotation中创建一个bussness类的名称为bussness的属性。
3.4需要结合看 更健康!
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView*)view{
MyAnnotation *ann =view.annotation; //当前显示地图的自定义大头针的view视图中可以拿到annotation,然后
和自定义的大头针进行关联赋值,现在就能得到自己的annotation。
Business * b = ann.business; //因为自定义大头针类中声明了一个Business类的business(注意大小写,一个是类一个是属性)
// 这样就可以得到Business类中所有解析出来的数据了; 这样就可以赋值给对象了就可以用了,好开森!!
UIViewController *vc = [[UIViewController alloc]init];
UIWebView *wv = [[UIWebView alloc]initWithFrame:vc.view.bounds];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:b.path]];只需要加载调用
Business类中path路径了(解析出来放到类中,所以可以用)
[wv loadRequest:request];
[vc.view addSubview:wv];
[self.navigationController pushViewController:vc animated:YES];
}