// 開始,公司要求制作一段跑步軌跡 在地圖上的 動畫回放, 傳入一段經(jīng)緯度,
開始一想,這不是很簡單嗎, 高德地圖有可以把經(jīng)緯度轉(zhuǎn)換成坐標點的方法
/**
* @brief 將經(jīng)緯度轉(zhuǎn)換為指定view坐標系的坐標
* @param coordinate 經(jīng)緯度
* @param view 指定的view
* @return 基于指定view坐標系的坐標
*/
- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;
// 我把經(jīng)緯度轉(zhuǎn)換成坐標點, 然后構(gòu)建 path
/* 構(gòu)建path, 調(diào)用著負責釋放內(nèi)存. */
- (CGMutablePathRef)pathForPoints:(CGPoint *)points count:(NSUInteger)count
{
if (points == NULL || count <= 1)
{
return NULL;
}
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddLines(path, NULL, points, count);
return path;
}
//? 在然后直接用 path ,初始化一個 CAShapeLayer ,做成動畫不就成了 嗎, 在它跑完之后直接刪除, 再用 高德地圖的折線替換,
// 這種方法也可以, 但是后來需求改了, 要求地圖旋轉(zhuǎn),并且地圖中心點一直在跑動的點上,
這樣,我以屏幕坐標構(gòu)建的 path 一旦地圖旋轉(zhuǎn), 就全亂了,
// 后來我又想到一個辦法, 我從地圖手機上定位畫線得到的靈感, 我把經(jīng)緯度點兩個兩個連成一個個短的折線,放到一個數(shù)組里面 ,然后定義了一個 index 屬性, ?再用一個定時器不停的循環(huán), 在定時器的方法中,用
[self.mapView addOverlay:self.mapOverlayArr[self.index] level:MAOverlayLevelAboveRoads];
不停加載線路在地圖上, 同時把地圖的中心點, 定位在 經(jīng)緯度數(shù)組取到的最新的經(jīng)緯度上
CLLocation * location = self.locationArray[self.index];
[self.mapView setCenterCoordinate:location.coordinate animated:NO];
,這樣就能保證地圖中心一直在跑動的點上, 而且定時器 ?方法 ?加載線路夠快的話, 就能產(chǎn)生動畫效果,?
然而, 又出現(xiàn)了問題, 定時器不停的運行
mapView 不停的加載 addOverlay ,使得屏幕非常卡, 經(jīng)緯度少的話還看不出來, 一旦經(jīng)緯度多了, 卡的不要不要的, 完全受不了, 而且手機非常燙, 電池都快燒壞了,, 所以這種方法不可行, 至少不完善
// 后來我研究高德地圖的畫線方法, 發(fā)現(xiàn)一個 方法
/**
* @brief 重新設置折線坐標點. since 5.0.0
* @param coords 指定的經(jīng)緯度坐標點數(shù)組, C數(shù)組,內(nèi)部會做copy,調(diào)用者負責內(nèi)存管理
* @param count 坐標點的個數(shù)
* @return 是否設置成功
*/
- (BOOL)setPolylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSInteger)count;
// 這個方法只用一條折線, 但是可以不停的改變這條折線的位置,?
終于利用這個方法 不卡了, 畫線的過程中 FPS 60 左右, 完美
// 因為文件太大就 不上傳了