ios - 无法在 Mapkit 叠加 View 上绘制路径

标签 ios

我在装有 iOS 4 的 iPhone 上使用 mapkit。 我正在使用自定义叠加层和自定义叠加层 View 在 map 上绘制形状。 目前,形状只是矩形,但我正在计划更复杂的东西。这就是我不使用 MKPolygon 覆盖类型的原因。 这是我的叠加 View 绘制方法的代码:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    // Clip context to bounding rectangle
    MKMapRect boundingMapRect = [[self overlay] boundingMapRect];
    CGRect boundingRect = [self rectForMapRect:boundingMapRect];
    CGContextAddRect(context, boundingRect);
    CGContextClip(context);

    // Define shape
    CGRect shapeRect = CGRectMake(0.5f, 0.5f, boundingRect.size.width - 1.0f, boundingRect.size.height - 1.0f);

    // Fill
    CGContextSetRGBFillColor(context, 0.5f, 0.5f, 0.5f, 0.5f);
    CGContextFillRect(context, shapeRect);

    // Stroke
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.75f);
    CGContextSetLineWidth(context, 1.0f);
    CGContextStrokeRect(context, shapeRect);
}

问题是矩形被正确填充(因此它们的边界矩形似乎设置正确),但它们没有被描边。 谁能帮忙? 谢谢!

最佳答案

如之前的一些评论所述,问题出在线宽上。更一般地说,所有绘图都会自动缩放以跟随 map 缩放,因此如果您希望某些绘图指标与缩放无关,则必须将其除以 zoomScale。

这是新代码,可以在我的 iPhone 4 上正常工作:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    // Clip context to bounding rectangle
    MKMapRect boundingMapRect = [[self overlay] boundingMapRect];
    CGRect boundingRect = [self rectForMapRect:boundingMapRect];
    CGContextAddRect(context, boundingRect);
    CGContextClip(context);

    // Define shape
    CGRect shapeRect = CGRectInset(boundingRect, 2.0f / zoomScale, 2.0f / zoomScale);

    // Fill
    CGContextSetRGBFillColor(context, 0.5f, 0.5f, 0.5f, 0.5f);
    CGContextFillRect(context, shapeRect);

    // Stroke
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.75f);
    CGContextSetLineWidth(context, 4.0f / zoomScale);
    CGContextStrokeRect(context, shapeRect);
}

我还将报告我在叠加层中用于计算和返回边界矩形的代码,因为我认为它可以提供帮助:

-(MKMapRect)boundingMapRect
{
    // Overlay bounds
    CLLocationCoordinate2D topLeftcoordinate = <the top-left coordinate of overlay>;
    CLLocationCoordinate2D bottomRightCoordinate = <the bottom-right coordinate of overlay>;

    // Convert them to map points
    MKMapPoint topLeftPoint = MKMapPointForCoordinate(topLeftcoordinate);
    MKMapPoint bottomRightPoint = MKMapPointForCoordinate(bottomRightCoordinate);

    // Calculate map rect
    return MKMapRectMake(topLeftPoint.x, topLeftPoint.y, bottomRightPoint.x - topLeftPoint.x, topLeftPoint.y - bottomRightPoint.y);
}

感谢大家的意见和建议。

关于ios - 无法在 Mapkit 叠加 View 上绘制路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266301/

相关文章:

ios - Realm swift : how to catch RLMException?

ios - Swift 从特定相册中选择所有照片

ios - UITableViewCell 内的连续动画

objective-c - 如何在iPad上播放系统按键点击音效?

ios - 如何创建带有部分和分组单元格的自定义 UITableView?

ios - UICollectionView 选择不会持续

ios - Multipeer Connectivity 数据仅以一种方式发送,即使两个设备都已连接

ios - 如何在 Swift 中退出 "DispatchQueue.main.asyncAfter"

ios - 较小时 UIScrollView 的中心内容

ios - 特拉维斯 : xcodebuild: error: Unable to find a destination matching the provided destination specifier