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

解决方案:

 

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];

}

你可能感兴趣的:(IOS学习笔记,IOS,地图,解决方案,大众点评,刘国斌)