地圖阻尼運動

沒錯,還是關(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ù)
給你的地圖點燈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容