gpt4 book ai didi

ios - 我可以动态放大/缩小在 UIMapView 上绘制的不对称多边形吗?

转载 作者:行者123 更新时间:2023-12-01 18:14:51 25 4
gpt4 key购买 nike

我试图首先使用 MKPolygon 作为动态覆盖在 UIMapView 上绘制一个不对称多边形。之后,最终用户应该能够放大/缩小该特定区域,而 map 区域的其余部分则保持不变。

简单地从最终用户的角度来看,该人应该能够使用他的手指在 map View 上绘制一些区域,然后仅缩放该特定区域,而其他区域不受缩放操作的影响。

最佳答案

据我所知,没有内置的方法可以做到这一点。
此外,官方文档指出:

You use this class as-is to display map information and to manipulate the map contents from your application. You can center the map on a given coordinate, specify the size of the area you want to display, and annotate the map with custom information.


因此,要实现您想要实现的目标,您需要使用两个 MKMapView ,一个比一个。
项目链接
我做了一个简单的项目来向你展示它的功能,你可以在这里找到它: https://github.com/leonardfactory/mapview-polygon-mask
截屏
在这里,您可以看到内部 mapView 在随机多边形中显示缩放 map 。
iPhone screenshot with two MKMapView
解释
开始以编程方式或使用 Storyboard 添加两个 MKMapView。
在此之后,您可以屏蔽最上面的 MKMapViewCAShapeLayer ,使用 MKPolygon 中的点设置了哪个路径. MKPolygon但是只存储 MKMapPoint ,所以我们需要在 CGPoint 中转换这些。我们能做些什么? MKMapView 提供了一个有用的方法来做到这一点。本身, convertCoordinate:toPointInView: ,将 CLLocationCoordinate2D 点转换为普通的 CGPoint,例如我们可以编写如下方法:
/**
* Convert between MKMapPoint and CGPoint, to be used as masking path point.
*
* @param point The MKMapPoint to be converted
*
* @return The CGPoint, converted in UIView coords from MKMapPoint provided
*/
- (CGPoint) convertPointToMapView:(MKMapPoint) point
{
return [self.mainMapView convertCoordinate:MKCoordinateForMapPoint(point) toPointToView:self.mainMapView];
}
给定一个多边形,你只需要创建一个 CAShapeLayer 路径,使用这个辅助方法,并将它作为掩码应用到另一个 MKMapView , 像这样:
// Create a CAShapeLayer to hold masking path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
CGMutablePathRef mask = CGPathCreateMutable();

// First point...
CGPoint firstPoint = [self convertPointToMapView:polygon.points[0]];
CGPathMoveToPoint(mask, NULL, firstPoint.x, firstPoint.y);

// Then with some simple CG functions we can draw all the mask
for(NSUInteger i = 0; i < polygon.pointCount - 1; i++)
{
CGPoint nextPoint = [self convertPointToMapView:polygon.points[i+1]];
CGPathAddLineToPoint(mask, NULL, nextPoint.x, nextPoint.y);
}

// Close path
CGPathCloseSubpath(mask);

maskLayer.path = mask;
CGPathRelease(mask);

// Mask the second MKMapView
self.backgroundMapView.layer.mask = maskLayer;
需要注意的一些事项:
  • polygon是一个 MKPolygon。如果需要从水龙头中绘制一张,可以使用 MKMapView 方法 convertPoint:toCoordinateInView: ,这与方法 converCoordinate:toPointInView 完全相反我以前用过。
  • polygon.pointsMKMapPoint 的 C 数组(所以它的类型是 MKMapPoint * )
  • 关于ios - 我可以动态放大/缩小在 UIMapView 上绘制的不对称多边形吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23093675/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com