在Mapbox上添加模糊效果

时间:2017-01-02 10:14:31

标签: ios objective-c mapbox

我想在mapbox中添加模糊效果。当第一次加载地图时,时间只显示地图中的当前位置其他地图是蓝色。见截图

enter image description here

当我将用户位置移动到另一个位置时,地图上的其他位置清晰。还要在特定位置显示注释 看截图

enter image description here

帮助我如何实现这个

这里我将实现一些代码

- (CGPoint)convertLatLongCoord:(CGPoint)latLong {
    CGSize screenSize = [UIScreen mainScreen].applicationFrame.size];
    CGFloat SCALE = MIN(screenSize.width, screenSize.height) / (2.0 * EARTH_RADIUS);
    CGFloat OFFSET = MIN(screenSize.width, screenSize.height) / 2.0;
    CGFloat x = EARTH_RADIUS * cos(latLong.x) * cos(latLong.y) * SCALE + OFFSET;
    CGFloat y = EARTH_RADIUS * cos(latLong.x) * sin(latLong.y) * SCALE + OFFSET;

    return CGPointMake(x, y);
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    NSLog(@"data=%f",self.mapview.userLocation.coordinate.latitude);
    CLLocation *currentLoc=[locations objectAtIndex:0];
    _coordinate=currentLoc.coordinate;
CGPoint latLong = {_coordinate.latitude, _coordinate.longitude};
    oldcord = [self convertLatLongCoord:latLong];
    NSLog(@"Cartesian Coordinate: (%f, %f)",oldcord.x, oldcord.y);

}

在这段代码中,我将得到UserLocation坐标的完美视图像素点。之后我想用CGPoint清除视图中的模糊,但我无法得到它。我认为我将创建CGPoint数组,而不是使用线条来模糊查看,但我不能得到它请建议我。

我也使用这个lib但我无法理解https://github.com/DenHeadless/Shapes

1 个答案:

答案 0 :(得分:3)

按照我在评论中添加的逻辑here我为您download it here 制作了示例,请检查下面的结果

enter image description here

该示例包含以下逻辑。

  1. 使用iOS地图,在地图上方添加了一个自定义UIView UIView是DrawView,它实际上处理所有绘图和 擦除部分。
  2. 我们当然有CLLocationManager来确定用户的移动。
  3. 只要CLLocationManager开始提供位置,我们就会使用以下代码转换关于MapView引脚位置的坐标

    CGPoint pt=[self.map convertCoordinate:location.coordinate toPointToView:self.view];
    

    我们传递CGPoint,它是UIView的转换值,用于清除图纸中的区域

    [self.drawView eraseAtPoint:pt];
    
  4. 当来自用户坐标的CGPoint传递给DrawView eraseAtPoint函数时,我们擦除一个已定义半径的区域,并根据需要清除该区域。

  5. 我添加了一个示例directions.gpx文件来模拟GPS位置,示例GIF显示了移动。

  6. 注意:项目的链接将在 2017年3月14日之后过期,因此请保持下载状态,如果您希望样本再次ping注释。随意根据需要进行修改。

    <强>更新

    添加以圆圈而不是方块擦除区域的功能,只需将 DrawView 中的drawRect功能替换为下面的代码

    - (void)drawRect:(CGRect)rect {    
    
        // Drawing code
        UIColor *backgroundColor=[UIColor colorWithRed:0.85 green:0.85 blue:0.85 alpha:1.0f];//Grey
    
        [backgroundColor setFill];
        UIRectFill(rect);
    
        if(!self.initialLoad){//If the view has been loaded from next time we will try to clear area where required..
    
            // clear the background in the given rectangles
            for (NSValue *holeRectValue in _rectArray) {
                CGContextRef context = UIGraphicsGetCurrentContext();
    
                CGRect holeRect = [holeRectValue CGRectValue];
    
                [[UIColor clearColor] setFill];
    
                CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );
    
                CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );
                CGContextSetBlendMode(context, kCGBlendModeClear);
    
                CGContextFillEllipseInRect( context, holeRectIntersection );
    
            }
        }
    
        self.initialLoad=NO;
    }
    

    干杯。