iOS - 解决方法 MKOverlayRenderer 和 Alpha 属性

iOS - Workaround MKOverlayRenderer and Alpha property

如何在 MKOverlayRenderer 传递给地图后访问和修改它的 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 时才会调用,对吗?

所以我的问题是:有没有一种方法可以更改和设置此 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 值似乎是一个缓慢的过程。

实际上我想动态地将 OverlayRenderer 的 alpha 值从 0 切换到 1,这样我就可以显示 1 个 Overlay、隐藏它、显示另一个 Overlay、隐藏它等等...

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

您可以在拥有叠加层和移除叠加层以及具有 alpha 初始值之间切换。

作为参考,请试试这个 link: https://github.com/mapbox/mbxmapkit/issues/7

还有这个:https://github.com/mapbox/mbxmapkit/issues/39

好的,所以我使用 adding/removing MKTileOverlay 而不是使用 alpha 值,正如评论中提到的@Sharpkits。

我几乎得到了预期的结果。我只是在第一次渲染图块时遇到问题,我遇到了一些小故障,因为渲染是逐个图块进行的。

我认为我应该在渲染叠加层时的前 2 秒显示微调器。

在那次延迟之后,我的带有平铺图像的动画可以流畅地播放。

缩放 in/out 时仍然出现故障效果,因为必须渲染新的图块。

一些上下文

基本上我想用10张图片制作一个动画。所有图像都根据特定的缩放级别、特定位置和 15 分钟的时间间隔进行切割。

我有一个 UISlider 和一个 Play/Pause 按钮,我正在根据动画播放时滑块的位置删除或添加特定的叠加层。在我的滑块上使用 tapGestureRecognizer,我可以在 "video" 中返回并进一步显示必须显示的叠加层。

-(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 的位置显示 Overlay 的部分。

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

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