没错,还是关于地图的。
其实我是比较犹豫要不要为了这样一个东西写篇文章,因为我觉得这个东西比较简单,可是在网上搜了一大圈后,发现竟没有这方面的文章,好吧,可能是因为大伙觉得比较low,而没有写。
不过我还是写下来吧,万一以后有人用呢。
先看下什么是地图阻尼。
在这里我们每次点击左侧的加号时,地图层级加1,点击减号的时候,地图层级减1。
如果没有阻尼的话,我们的地图几乎会在瞬间(0.1s
)进入指定的层级,动画僵硬,给人的美感太差。
有阻尼的话,我们可以让地图在指定的时间内(本demo中是1s
),从层级A变化到层级B。
实现思路:
我们假如要在1s
内,将地图层级从11
变为13
,那么我们就将这1秒钟
分成10份
,一份是0.1s
,而每过一个0.1s
,地图层级变化的增量就是(13-11)/10 = 0.2
。这样我们可以每过0.1s
就更新地图的层级(setZoomLevel :
),就可以了。当1s
结束的时候,地图层级刚好就是我们想要的层级,是不是很简单。
直接上代码:
//由于是弱业务,所以该代码写在`MapViewManager`类中。
/*定义地图缩放的持续时长*/
#define MAP_ZOOM_DURATION 1.0
/*地图从一个级别缩放至另一个级别,地图的缩放总次数*/
#define MAP_ZOOM_NUMS 10.0
/**
阻尼效果改变地图等级
@param currentLevel 当前的等级
@param settingLevel 要设定的等级
*/
- (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地址
我想这应该不会是地图系列的最后一篇。。
下面是地图系列的其他相关文章:
给你的地图模块动手术
给你的地图点灯