// 開始,公司要求製做一段跑步軌跡 在地圖上的 動畫回放, 傳入一段經緯度,數組
開始一想,這不是很簡單嗎, 高德地圖有能夠把經緯度轉換成座標點的方法動畫
/**內存
* @brief 將經緯度轉換爲指定view座標系的座標it
* @param coordinate 經緯度內存管理
* @param view 指定的viewio
* @return 基於指定view座標系的座標table
*/循環
- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;map
// 我把經緯度轉換成座標點, 而後構建 path定時器
/* 構建path, 調用着負責釋放內存. */
- (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 ,作成動畫不就成了 嗎, 在它跑完以後直接刪除, 再用 高德地圖的折線替換,
// 這種方法也能夠, 可是後來需求改了, 要求地圖旋轉,而且地圖中心點一直在跑動的點上,
這樣,我以屏幕座標構建的 path 一旦地圖旋轉, 就全亂了,
// 後來我又想到一個辦法, 我從地圖手機上定位畫線獲得的靈感, 我把經緯度點兩個兩個連成一個個短的折線,放到一個數組裏面 ,而後定義了一個 index 屬性, 再用一個定時器不停的循環, 在定時器的方法中,用
[self.mapView addOverlay:self.mapOverlayArr[self.index] level:MAOverlayLevelAboveRoads];
不停加載線路在地圖上, 同時把地圖的中心點, 定位在 經緯度數組取到的最新的經緯度上
CLLocation * location = self.locationArray[self.index];
[self.mapView setCenterCoordinate:location.coordinate animated:NO];
,這樣就能保證地圖中心一直在跑動的點上, 並且定時器 方法 加載線路夠快的話, 就能產生動畫效果,
然而, 又出現了問題, 定時器不停的運行
mapView 不停的加載 addOverlay ,使得屏幕很是卡, 經緯度少的話還看不出來, 一旦經緯度多了, 卡的不要不要的, 徹底受不了, 並且手機很是燙, 電池都快燒壞了,, 因此這種方法不可行, 至少不完善
// 後來我研究高德地圖的畫線方法, 發現一個 方法
/**
* @brief 從新設置折線座標點. since 5.0.0
* @param coords 指定的經緯度座標點數組, C數組,內部會作copy,調用者負責內存管理
* @param count 座標點的個數
* @return 是否設置成功
*/
- (BOOL)setPolylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSInteger)count;
// 這個方法只用一條折線, 可是能夠不停的改變這條折線的位置,
終於利用這個方法 不卡了, 畫線的過程當中 FPS 60 左右, 完美
// 由於文件太大就 不上傳了