地圖高級 - 自定義大頭針
1. 理論支撐
按照MVC的原則
1. 每當添加一個大頭針數(shù)據(jù)模型時, 地圖就會調(diào)用對應(yīng)的代理方法, 查找對應(yīng)的大頭針視圖,顯示在地圖上;
2. 如果該方法沒有實現(xiàn), 或者返回nil, 那么就會使用系統(tǒng)默認的大頭針視圖
2. 模擬實現(xiàn)系統(tǒng)大頭針
-
實現(xiàn)當添加大頭針數(shù)據(jù)模型時,地圖回調(diào)的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XXXAnnotation *)annotation { }
-
實現(xiàn)須知
1. 大頭針系統(tǒng)對應(yīng)的視圖是 MKPinAnnotationView损同,它繼承自 MKAnnotationView 2. 地圖上的大頭針視圖脖旱,和tableview上的cell一樣忽冻,都使用“循環(huán)利用”的機制
-
實現(xiàn)代碼
// 定義緩存標識 static NSString *pinID = @"pinID"; // 緩存中取大頭針 MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pinID]; // 緩存中不存在大頭針璧亚,則創(chuàng)建 if (!pinView) { pinView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:pinID]; } // 設(shè)置模型數(shù)據(jù) pinView.annotation = annotation; // 彈出標注 pinView.canShowCallout = YES; // 修改大頭針顏色 pinView.pinColor = MKPinAnnotationColorPurple; // 設(shè)置大頭針從天而降 pinView.animatesDrop = YES; // 設(shè)置大頭針可以被拖拽(父類中的屬性) pinView.draggable = YES; return pinView;
3. 自定義大頭針
-
實現(xiàn)當添加大頭針數(shù)據(jù)模型時,地圖回調(diào)的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XXXAnnotation *)annotation
{
}
```
-
實現(xiàn)須知
1. 如果想要自定義大頭針, 必須使用 MKAnnotationView 或者 自定義的子類 2. 但是不能直接使用系統(tǒng)默認的大頭針, 會無效
實現(xiàn)代碼
// 自定義大頭針
static NSString *pinID = @"pinID";
MKAnnotationView *customPinView = [mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
if (!customPinView) {
customPinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinID];
}
// 設(shè)置大頭針圖片
customPinView.image = [UIImage imageNamed:@"category_3"];
// 設(shè)置大頭針可以彈出標注
customPinView.canShowCallout = YES;
// 設(shè)置標注左側(cè)視圖
UIImageView *leftIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
leftIV.image = [UIImage imageNamed:@"huba.jpeg"];
customPinView.leftCalloutAccessoryView = leftIV;
// 設(shè)置標注右側(cè)視圖
UIImageView *rightIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
rightIV.image = [UIImage imageNamed:@"eason.jpg"];
customPinView.rightCalloutAccessoryView = rightIV;
// 設(shè)置標注詳情視圖(iOS9.0)
customPinView.detailCalloutAccessoryView = [[UISwitch alloc] init];
return customPinView;
4. 代理方法補充
-
選中一個大頭針時調(diào)用
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
NSLog(@"選中%@", [view.annotation title]);
}
```
-
取消選中大頭針時調(diào)用
-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { NSLog(@"取消選中%@", [view.annotation title]); }
5. 其他方法補充
- 添加導(dǎo)航條上的用戶追蹤按鈕
navigationItem.leftBarButtonItem = MKUserTrackingBarButtonItem(mapView: mapView)
6. 測試環(huán)境
1. 加載地圖數(shù)據(jù)需要聯(lián)網(wǎng)
2. XCode版本不限
3. iOS系統(tǒng)版本不限
7. 常見問題總結(jié)
1. 代碼運行在低版本的XCode上, 編譯失敗
第一: 語法錯誤; XCode7.0 對于OC語法優(yōu)化了一些, 需要手動調(diào)整
第二: iOS9.0的SDK, 在XCode7.0之前的版本沒有對應(yīng)的API