如何在MKOverlayRenderer传递给Map之后访问和修改它的alpha属性?
确实,我可以修改rendererForOverlay
方法中的alpha属性:
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay
{
if ([overlay isKindOfClass:[MKTileOverlay class]]) {
MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];
renderer.alpha = 0.6;
return renderer;
}
return nil;
}
但只有当我向MapView添加Overlay时才会调用此方法吗?
所以我的问题是:即使我的Overlay已在地图上呈现,有没有办法可以更改并设置此alpha属性的值?
我尝试使用以下命令将渲染器添加到NSMutableArray:
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay
{
if ([overlay isKindOfClass:[MKTileOverlay class]]) {
_allRenderer = [[NSMutableArray alloc] init];
MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];
renderer.alpha = 0.0;
[_allRenderer addObject:renderer];
return renderer;
}
return nil;
}
然后我可以通过调用我所做的方法来改变透明度:
-(void)changeAlpha:(NSUInteger)index : (BOOL)isOpaque {
if (isOpaque)
[[_allRenderer objectAtIndex:index] setAlpha:0.0];
else
[[_allRenderer objectAtIndex:index] setAlpha:1.0];
}
有没有更好的方法来做到这一点? 设置alpha值似乎是一个缓慢的过程。
实际上我想动态地从0切换到1 OverlayRenderer的alpha值,这样我就可以显示1个叠加,隐藏它,显示另一个,隐藏它等等......
答案 0 :(得分:1)
所以基本上你可以做的是:而不是试图设置不同的alpha。
您可以在拥有叠加层并将其删除并具有alpha的初始值之间切换。
供参考,请尝试以下链接: https://github.com/mapbox/mbxmapkit/issues/7
答案 1 :(得分:0)
好的,所以我使用添加/删除MKTileOverlay而不是使用alpha值,正如@Sharpkits在评论中提到的那样。
我几乎得到了预期的结果。我第一次渲染图块时遇到了一个问题,我遇到了一些问题,因为渲染是逐个图块的。
我认为我应该在Overlays渲染时显示前2秒的微调器。
在延迟之后,我的平铺图像动画播放顺畅。
放大/缩小时仍然会出现毛刺效果,因为必须渲染新的图块。
某些背景
基本上我想用10张图片制作动画。所有图像都根据特定的缩放级别,特定位置和15分钟的时间间隔进行剪切。
我有一个UISlider和一个播放/暂停按钮,我根据播放动画时滑块的位置移除或添加特定的叠加。使用我的Slider上的tapGestureRecognizer,我可以回到&#34;视频&#34;我正在显示必须显示的叠加层。
-(void)showOverlay:(NSUInteger)index {
for (int i = 0; i < [_allTileOverlay count]; i++) {
if (i != index)
[_mapView removeOverlay:[_allTileOverlay objectAtIndex:i]];
else
[_mapView addOverlay:[_allTileOverlay objectAtIndex:index]];
}
}
这是我在播放动画时根据我的UISlider的位置显示叠加的部分。
if ([_allTileOverlay count]>0) {
if (_currentSlider.value>=[_allTileOverlay count]-1) {
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates
[self showOverlay:0];
});
_currentSlider.value=0;
}else{
//scroll to desire position
_currentSlider.value++;
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates
[self showOverlay:_currentSlider.value];
});
}
}
要完成这项功能还有一些工作要做,但我会关闭这个问题,因为我得到了我所期望的所有信息。