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
好的,所以我使用 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];
});
}
}
为了完成该功能还有一些工作要做,但我会关闭这个问题,因为我得到了我期望的所有信息。
如何在 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
好的,所以我使用 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];
});
}
}
为了完成该功能还有一些工作要做,但我会关闭这个问题,因为我得到了我期望的所有信息。