【问题标题】:iOS - Workaround MKOverlayRenderer and Alpha propertyiOS - 解决方法 MKOverlayRenderer 和 Alpha 属性
【发布时间】:2016-10-14 09:25:17
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c mapkit alpha mktileoverlay


    【解决方案1】:

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

    您可以在叠加和移除叠加层以及为 alpha 设置初始值之间切换。

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

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

    【讨论】:

      【解决方案2】:

      好的,所以我添加/删除了 MKTileOverlay,而不是像 cmets 中提到的 @Sharpkits 那样使用 alpha 值。

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

      我想我应该在叠加层渲染的前 2 秒显示一个微调器。

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

      我在放大/缩小时仍然会出现故障效果,因为必须渲染新的图块。

      一些背景

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

      我有一个 UISlider 和一个播放/暂停按钮,我正在删除或添加特定的叠加层,根据动画播放时我的 Slider 的位置。使用 Slider 上的 tapGestureRecognizer,我可以在显示必须显示的叠加层时返回并进一步查看“视频”。

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

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

      【讨论】:

        猜你喜欢
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        • 2019-09-08
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        相关资源
        最近更新 更多