"动画效果"圆形覆盖与圆形渲染器在地图视图上闪烁

时间:2015-01-14 02:07:57

标签: ios mkmapview

当用户在屏幕上捏住时,我需要不断更改MKCircle的半径。因为它的radius属性是只读的,所以我会连续删除并重新创建圆圈和渲染器,我相信这会导致闪烁"用户捏时的效果。当动画"动画时,它会不断出现/消失。在视觉上看起来非常糟糕,创造了一个糟透的UX。这是我的代码:

//this method may be called many times a second.
-(void)refreshRadius{ //called when user pinches after updating to correct radius.
    if(radiusCircle){
        [self.mapView removeOverlay:radiusCircle];
    }
    radiusCircle = [MKCircle circleWithCenterCoordinate:userCoordinates radius:radius];
    [self.mapView addOverlay:radiusCircle level:MKOverlayLevelAboveLabels];
}

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay{
    if(overlay == radiusCircle){
        MKCircleRenderer *renderer = [[MKCircleRenderer alloc] initWithCircle:radiusCircle];
        renderer.strokeColor = [UIColor colorWithWhite:1 alpha:0.5];
        renderer.lineWidth = 0.8;
        renderer.fillColor = [UIColor colorWithRed:0.3 green:0.36 blue:0.7 alpha:0.2];
        return renderer;
    }else{
        return nil;
    }
}

我怎样才能动画&#34;半径是否顺利?

1 个答案:

答案 0 :(得分:0)

经过一番实验,我很幸运地找到了解决方案。但是,虽然它现在运行良好,但它很容易在iOS SDK中进行未来的内部更改。我首先设置了只读属性&#34; radius&#34;使用KVC。然后,我使渲染器的路径无效,导致它使用新的半径立即重绘。它不是最流畅的60FPS动画,但它的效果非常好。这是代码:

[radiusCircle setValue:@(radius) forKey:@"radius"];
[renderer invalidatePath];

radiusCircle是我的MKCircle个实例,renderer是我的圆圈渲染器。它有效。