iOS - 解决方法MKOverlayRenderer和Alpha属性

时间:2016-10-14 09:25:18

标签: ios objective-c mapkit alpha mktileoverlay

如何在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个叠加,隐藏它,显示另一个,隐藏它等等......

2 个答案:

答案 0 :(得分:1)

所以基本上你可以做的是:而不是试图设置不同的alpha。

您可以在拥有叠加层并将其删除并具有alpha的初始值之间切换。

供参考,请尝试以下链接: https://github.com/mapbox/mbxmapkit/issues/7

此外:https://github.com/mapbox/mbxmapkit/issues/39

答案 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];
            });
        }
    }

要完成这项功能还有一些工作要做,但我会关闭这个问题,因为我得到了我所期望的所有信息。