iOS-自定制 地圖大頭針

- (void)viewDidLoad {
    [super viewDidLoad];
   
    if(self.userData.city.length < 2)
    {
        return;
    }
    self.mapView.delegate = self;
    // CLGeocoder 解析地址
    CLGeocoder *geoCoder = [CLGeocoder new];
    // 地址解碼
    [geoCoder geocodeAddressString:self.userData.city completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        self.placemark = placemarks[0];
        // 插入大頭針
        FLAnnotation *ann = [FLAnnotation new];
        ann.coordinate = self.placemark.location.coordinate;
        ann.title = self.userData.name;
        ann.subtitle = self.userData.city;
        ann.iconUrl = self.userData.iconUrl;
       
        [self.mapView addAnnotation:ann];
        self.mapView.showsUserLocation = YES;
    }];
   
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(getUserPosition:)];
    // 點擊3下觸發(fā)
    tap.numberOfTapsRequired = 3;
    [self.mapView addGestureRecognizer:tap];
}

// 獲取用戶位置
- (void) getUserPosition:(UITapGestureRecognizer *)tap
{
    CGPoint pt = [tap locationInView:tap.view];
    // CLLocationCoordinate2D 枚舉類型, 經緯度
    CLLocationCoordinate2D co = [self.mapView convertPoint:pt toCoordinateFromView:self.mapView];
   
    CLGeocoder *geoCoder = [CLGeocoder new];
    CLLocation *location = [[CLLocation alloc] initWithLatitude:co.latitude longitude:co.longitude];
   
    [geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        CLPlacemark * placemark = placemarks[0];
       
        // 大頭貼的信息
        MKPointAnnotation * ann = [MKPointAnnotation new];
        ann.coordinate = co;
        ann.title = [NSString stringWithFormat:@"%@ %@", placemark.country, placemark.administrativeArea];
        ann.subtitle = placemark.name;
        [self.mapView addAnnotation:ann];
    }];
}

// 按照鼠標點擊的地方和需要放大的地方的中心點放大
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if(!self.updateUserLocation)
    {
        // 計算差距
        MKCoordinateSpan span = MKCoordinateSpanMake(fabs(userLocation.coordinate.latitude-self.placemark.location.coordinate.latitude)+1, fabs(userLocation.coordinate.longitude-self.placemark.location.coordinate.longitude)+1);
       
        // 中心
        CLLocationCoordinate2D center = CLLocationCoordinate2DMake((userLocation.coordinate.latitude+self.placemark.location.coordinate.latitude)/2, (userLocation.coordinate.longitude+self.placemark.location.coordinate.longitude)/2);
       
        // 范圍
        MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
        [self.mapView setRegion:region animated:YES];
       
        self.updateUserLocation = YES;
    }
}

#pragma mark -- 設置大頭貼
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if([annotation isKindOfClass:[FLAnnotation class]])
    {
        static NSString *annID = @"FL_ANN_ID";
        MKAnnotationView *annVIew = [mapView dequeueReusableAnnotationViewWithIdentifier:annID];
        if(!annVIew)
        {
            annVIew = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annID];
            annVIew.canShowCallout = YES;
            // 在 地理信息左側添加圖片
            UIImageView *leftImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
            annVIew.leftCalloutAccessoryView = leftImage;
           
            UIImageView *rightImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
            annVIew.rightCalloutAccessoryView = rightImage;
            rightImage.userInteractionEnabled = YES;
           
            UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(navi2:)];
            [rightImage addGestureRecognizer:tap];
        }
        // 給大頭針添加左右圖片
        FLAnnotation *fla = (FLAnnotation *)annotation;
        UIImageView *iconImageView = (UIImageView *)annVIew.leftCalloutAccessoryView;
        [iconImageView sd_setImageWithURL:[NSURL URLWithString:fla.iconUrl]];
       
        annVIew.image = [UIImage imageNamed:@"icon_marker"];
       
        UIImageView * rightView = (UIImageView *)annVIew.rightCalloutAccessoryView;
       
        objc_setAssociatedObject(rightView, &annStoreKey, fla, OBJC_ASSOCIATION_ASSIGN);
       
        return annVIew;

       
    }
   
    //如果不是則調用系統(tǒng)的
    else
    {
        return nil;
    }
}

// 路程導航(從用戶位置到目的地)
- (void) navi2:(UITapGestureRecognizer *)gesture
{
    FLAnnotation * ann = objc_getAssociatedObject(gesture.view, &annStoreKey);
   
    MKMapItem * fromItem = [MKMapItem mapItemForCurrentLocation];
    MKMapItem * toItem = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:ann.coordinate addressDictionary:nil]];
   
    toItem.name = ann.title;
   
    [MKMapItem openMapsWithItems:@[fromItem, toItem]
                   launchOptions:[NSDictionary dictionaryWithObjects:@[MKLaunchOptionsDirectionsModeDriving, @(YES)]
                                                             forKeys:@[MKLaunchOptionsDirectionsModeKey, MKLaunchOptionsShowsTrafficKey]]];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末取试,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌优训,老刑警劉巖造虎,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舔清,居然都是意外死亡含友,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門护奈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缔莲,“玉大人,你說我怎么就攤上這事霉旗〕兆啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵厌秒,是天一觀的道長读拆。 經常有香客問我,道長鸵闪,這世上最難降的妖魔是什么檐晕? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蚌讼,結果婚禮上辟灰,老公的妹妹穿的比我還像新娘。我一直安慰自己篡石,他們只是感情好芥喇,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凰萨,像睡著了一般继控。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胖眷,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天武通,我揣著相機與錄音,去河邊找鬼珊搀。 笑死冶忱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的境析。 我是一名探鬼主播囚枪,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼簿晓!你這毒婦竟也來了眶拉?” 一聲冷哼從身側響起千埃,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤憔儿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后放可,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谒臼,經...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡朝刊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜈缤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拾氓。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖底哥,靈堂內的尸體忽然破棺而出咙鞍,到底是詐尸還是另有隱情,我是刑警寧澤趾徽,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布续滋,位于F島的核電站,受9級特大地震影響孵奶,放射性物質發(fā)生泄漏疲酌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一了袁、第九天 我趴在偏房一處隱蔽的房頂上張望朗恳。 院中可真熱鬧,春花似錦载绿、人聲如沸粥诫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臀脏。三九已至,卻和暖如春冀自,著一層夾襖步出監(jiān)牢的瞬間揉稚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工熬粗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搀玖,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓驻呐,卻偏偏與公主長得像灌诅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子含末,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容