iOS开发-------地图固定位置显示附近微博(MKMapView 地图类)

       地图定位,是相关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;

     因为现在还不能完成定位,所以需要在ViewDidLoad中初始化一个地图的位置,我选择的是天安门,也就是说搜索的是天安门附件的微博,那么首先要有一个申请微博的管理类(单例),我自定义的类叫做WeiboManager

申请微博,首先完成管理者里的方法


在头文件中声明一个负责回调申请到的微博的代码块,以及一个获取附近微博的方法

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) {
        ;
    }];
}

最后就是实现viewDidLoad的方法

初始化微博Manager单例以及地图组件

    //初始化地图视图
    self.mapView = [[MKMapView alloc]initWithFrame:self.view.frame];
    
    //初始化单例
    self.weiboManager = [WeiBoManager shareWeiBoManager];

为mapView设置位置,因为目前为止还没有说到定位,所以需要一个初始化位置

    //创建一个传参结构体(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类也与以前不一样,首先看头文件,需要履行一个协议,这个协议规定了必须有的属性,map中只显示协议中相关属性的内容

//
//  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

因为在mapView中显示的东西需要有协议下的属性才可以显示,因为要重写协议属性的get方法

-(CLLocationCoordinate2D)coordinate
{
    return self.weiboLocationCoordinate2D;
}

-(NSString *)title
{
    return self.userName;
}

-(NSString *)subtitle
{
    return self.weiboText;
}

数据类以及模型类基本写完,这样基本功能就可以实现了。



如果觉得棒棒糖不好看。也可以自定义图片,不过还是需要履行一个协议,别忘了在viewDidLoad中设置委托对象

@interface ViewController ()<MKMapViewDelegate>

然后实现一个协议方法,是一个类似TableView的自定义cell方法

#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;
}



这样可以看一下,修改后的效果图

iOS开发-------地图固定位置显示附近微博(MKMapView 地图类)_第1张图片


基本功能就此已经实现。

你可能感兴趣的:(地图,MkMapView)