沒錯,還是關(guān)于地圖的。
其實我是比較猶豫要不要為了這樣一個東西寫篇文章,因為我覺得這個東西比較簡單,可是在網(wǎng)上搜了一大圈后,發(fā)現(xiàn)竟沒有這方面的文章,好吧,可能是因為大伙覺得比較low,而沒有寫。
不過我還是寫下來吧,萬一以后有人用呢。
先看下什么是地圖阻尼。

地圖阻尼.gif
在這里我們每次點擊左側(cè)的加號時,地圖層級加1,點擊減號的時候,地圖層級減1。
如果沒有阻尼的話,我們的地圖幾乎會在瞬間(0.1s)進入指定的層級,動畫僵硬,給人的美感太差。
有阻尼的話,我們可以讓地圖在指定的時間內(nèi)(本demo中是1s),從層級A變化到層級B。
實現(xiàn)思路:
我們假如要在1s內(nèi),將地圖層級從11變?yōu)?code>13,那么我們就將這1秒鐘分成10份,一份是0.1s,而每過一個0.1s,地圖層級變化的增量就是(13-11)/10 = 0.2。這樣我們可以每過0.1s就更新地圖的層級(setZoomLevel :),就可以了。當1s結(jié)束的時候,地圖層級剛好就是我們想要的層級,是不是很簡單。
直接上代碼:
//由于是弱業(yè)務(wù),所以該代碼寫在`MapViewManager`類中。
/*定義地圖縮放的持續(xù)時長*/
#define MAP_ZOOM_DURATION 1.0
/*地圖從一個級別縮放至另一個級別,地圖的縮放總次數(shù)*/
#define MAP_ZOOM_NUMS 10.0
/**
阻尼效果改變地圖等級
@param currentLevel 當前的等級
@param settingLevel 要設(shè)定的等級
*/
- (void)dampZoomingMapLevelFromCurrentValue:(float)currentLevel
ToSettingValue:(float)settingLevel{
float unitZoomLevelDuringTime = MAP_ZOOM_DURATION/MAP_ZOOM_NUMS;
float unitZoomLevelIncrement = (settingLevel - currentLevel)/MAP_ZOOM_NUMS;
for (int i = 1; i<=MAP_ZOOM_NUMS; i++) {
float tempZoomLevel = currentLevel+i*unitZoomLevelIncrement;
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (uint64_t)(NSEC_PER_SEC * (i*unitZoomLevelDuringTime)));
dispatch_after(time, dispatch_get_main_queue(), ^{
[_mapView setZoomLevel:tempZoomLevel];
});
}
}
demo地址
我想這應(yīng)該不會是地圖系列的最后一篇。。
下面是地圖系列的其他相關(guān)文章:
給你的地圖模塊動手術(shù)
給你的地圖點燈