沒錯(cuò),還是關(guān)于地圖的。
其實(shí)我是比較猶豫要不要為了這樣一個(gè)東西寫篇文章,因?yàn)槲矣X得這個(gè)東西比較簡(jiǎn)單,可是在網(wǎng)上搜了一大圈后,發(fā)現(xiàn)竟沒有這方面的文章,好吧,可能是因?yàn)榇蠡镉X得比較low,而沒有寫。
不過我還是寫下來吧,萬一以后有人用呢。
先看下什么是地圖阻尼。
地圖阻尼.gif
在這里我們每次點(diǎn)擊左側(cè)的加號(hào)時(shí),地圖層級(jí)加1,點(diǎn)擊減號(hào)的時(shí)候,地圖層級(jí)減1。
如果沒有阻尼的話,我們的地圖幾乎會(huì)在瞬間(0.1s
)進(jìn)入指定的層級(jí),動(dòng)畫僵硬,給人的美感太差。
有阻尼的話,我們可以讓地圖在指定的時(shí)間內(nèi)(本demo中是1s
),從層級(jí)A變化到層級(jí)B。
實(shí)現(xiàn)思路:
我們假如要在1s
內(nèi),將地圖層級(jí)從11
變?yōu)?code>13,那么我們就將這1秒鐘
分成10份
,一份是0.1s
,而每過一個(gè)0.1s
,地圖層級(jí)變化的增量就是(13-11)/10 = 0.2
。這樣我們可以每過0.1s
就更新地圖的層級(jí)(setZoomLevel :
),就可以了。當(dāng)1s
結(jié)束的時(shí)候,地圖層級(jí)剛好就是我們想要的層級(jí),是不是很簡(jiǎn)單。
直接上代碼:
//由于是弱業(yè)務(wù),所以該代碼寫在`MapViewManager`類中。
/*定義地圖縮放的持續(xù)時(shí)長*/
#define MAP_ZOOM_DURATION 1.0
/*地圖從一個(gè)級(jí)別縮放至另一個(gè)級(jí)別,地圖的縮放總次數(shù)*/
#define MAP_ZOOM_NUMS 10.0
/**
阻尼效果改變地圖等級(jí)
@param currentLevel 當(dāng)前的等級(jí)
@param settingLevel 要設(shè)定的等級(jí)
*/
- (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)該不會(huì)是地圖系列的最后一篇。。
下面是地圖系列的其他相關(guān)文章:
給你的地圖模塊動(dòng)手術(shù)
給你的地圖點(diǎn)燈