IOS 大众点评 地图实现(周边商铺地图)

来源:互联网 发布:微课程视频制作软件 编辑:程序博客网 时间:2024/04/30 22:10

解决方案:

 

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 = [superinitWithAnnotation:annotationreuseIdentifier:reuseIdentifier];

   if (self) {

       self.image = [UIImageimageNamed:@"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 = [NSMutableDictionarydictionary];

   NSUserDefaults *ud = [NSUserDefaultsstandardUserDefaults];  

    [dicsetObject:[udobjectForKey:@"city"]forKey:@"city"];

   NSArray * businesses = [DianpingApirequestBusinessesWithParamsDaTouZhen:dic];

5.2拿到了数据源数组就需要进行遍历了  其中下面的代码是解析类中实现好的代码 通过下面的代码和下下的代码就可以清楚精度纬度是怎么来的了,因为已经解析好了;    下面的解析类代码方便我们理解3中代码的意思

 Business *b = [[Businessalloc]init];

       

        b.name = [[businessDicobjectForKey:@"name"]componentsSeparatedByString:@"("][0];

       CLLocationCoordinate2Dcoord;

        coord.longitude =[[businessDicobjectForKey:@"longitude"]floatValue];

        coord.latitude =[[businessDicobjectForKey:@"latitude"]floatValue];

        b.coord = coord;

 

 

下面这段代码与1相关,直接写在1后面

for (Business *bin businesses) {

       if (b.coord.latitude > 200) {  //大于200是因为这里的错误数据存在经纬度为300的情况 经纬度一般都不是200

           continue;   //所以当经度大于200的时候跳出当前循环,继续执行下面的代码

       }

通过创建对象

       MyAnnotation *ann = [[MyAnnotationalloc]init];   annotation用来显示由一个经纬度定义的位置

      

ann.coordinate = b.coord;    //b.coord里面存放的是解析出来具体对象的经纬度数据;

                                      将这个数据传递给自定义的ann的coordinate属性中记录下来

        ann.business = b;  //这段代码是为4中代码服务的,意思就是将遍历出来的对象 赋值给ann中声明的business属性后期会用到。

       

        [self.mapViewaddAnnotation:ann];  //将自定义的ann加入到视图中

       

//这句话是直接设置地图的显示缩放大小,并且定位到具体的商户对象的经纬度上。

        [self.mapViewsetRegion:MKCoordinateRegionMake(b.coord,MKCoordinateSpanMake(.1,.1))]; 

   }

 

 

6.这段代码的意思就是在地图的view 显示出自己自定义的大头针地图图像; 相关实现很简单,别忘了强转。 标识目前不知道能用在哪里;

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

   MyAnnotationView *av = (MyAnnotationView *)[mapViewdequeueReusableAnnotationViewWithIdentifier:@"ann"];

   if (!av) {

        av = [[MyAnnotationViewalloc]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 = [[UIViewControlleralloc]init];

   UIWebView *wv = [[UIWebViewalloc]initWithFrame:vc.view.bounds];

   

   NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:b.path]];只需要加载调用

Business类中path路径了(解析出来放到类中,所以可以用)

    [wvloadRequest:request];

    [vc.viewaddSubview:wv];

   

    [self.navigationControllerpushViewController:vcanimated:YES];

}

0 0