如何在半径增加时在CLLocationManager中为区域绘制固定圆

我有要求我必须在CLLocationManager中绘制一个区域圈。 我已经完成了本规范的要求,

CLLocationDegrees latitude = 37.33492222; CLLocationDegrees longitude = -122.03304215; CLLocationCoordinate2D centerPoint = CLLocationCoordinate2DMake(latitude, longitude); CLLocationDistance radius = 100.0; CLRegion *region = [[CLRegion alloc]initCircularRegionWithCenter:centerPoint radius:radius identifier:@"Apple"]; [locationManager startMonitoringForRegion:region]; CAShapeLayer *circle = [CAShapeLayer layer]; circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 2.0*radius, 2.0*radius) cornerRadius:radius].CGPath; // Center the shape in self.view circle.position = CGPointMake(CGRectGetMidX(self.view.frame)-radius, CGRectGetMidY(self.view.frame)-radius); // Configure the apperence of the circle circle.fillColor = [UIColor clearColor].CGColor; circle.strokeColor = [UIColor redColor].CGColor; circle.lineWidth = 1; circle.opacity = 0.5; // Add to parent layer [self.view.layer addSublayer:circle; 

我已经拿出了 在这里输入图像说明

问题是当我给半径值为100,我得到的结果作为ScreenShot。 如果我将200的价值,那么显然这个圈子会增加。

我的问题是,如果给定值为200,300或400,我希望Circle的大小相同。

你的问题是关于增加半径,但在这个论坛中,“半径”通常被解释为以点/像素为单位测量的圆的半径。

显然,这不是你要求的。 现在,你已经说过你不想使用MKMapView ,但是在谈论你的目标时,我认为这是一种有用的语言。 底线,你不想改变在屏幕上呈现的圆的半径。 您想要更改将在前述圆圈中呈现的地图的“地区”( MKCoordinateRegion )的“跨度”( MKCoordinateSpan )。

有两种方法可以解决如何绘制代表地图投影的固定大小的圆圈的问题(但由于某种原因,您不需要地图)。

  1. 手动:

    • 定义一些有用的属性:

       @property (nonatomic) MKCoordinateRegion region; @property (nonatomic) CGRect frame; 

      region定义了将在用户界面中显示的经纬度范围。 该frame将成为我们将呈现这些经度和纬度点的屏幕坐标。 请注意,要在用户界面中对纬度/经度坐标进行可视化表示,您需要这两个方面的东西,一些定义lat / long可以表示的东西以及其他说明将其放在屏幕上的位置。

    • 所以,第一个问题是你如何定义区域。 在这里我定义了中心坐标,并定义了一个距离500米的区域:

       CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(...); self.region = MKCoordinateRegionMakeWithDistance(coordinate, 500.0, 500.0); 

      你问:“如何改变所显示的半径(即跨度)?” 你可以通过改变regionvariables来表示经纬度范围将在UI中表示。

    • 无论如何,你现在可以将圆圈添加到你的屏幕上:

       - (void)addCircle { CGPoint center = CGPointMake(self.view.layer.bounds.size.width / 2.0, self.view.layer.bounds.size.height / 2.0); CGFloat radius = self.view.layer.bounds.size.width * 0.40; UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:0.0 endAngle:M_PI * 2.0 clockwise:YES]; self.frame = CGRectMake(center.x - radius, center.y - radius, radius * 2.0, radius * 2.0); CAShapeLayer *layer = [CAShapeLayer layer]; layer.path = [path CGPath]; layer.strokeColor = [[UIColor darkGrayColor] CGColor]; layer.fillColor = [[UIColor whiteColor] CGColor]; layer.lineWidth = 3.0; [self.view.layer addSublayer:layer]; self.view.backgroundColor = [UIColor lightGrayColor]; } 
    • 编写一个例程,将CLLocationCoordinate2D转换为屏幕上的一个位置:

       - (CGPoint)determineCGPointFromCoordinate:(CLLocationCoordinate2D)coordinate { CGFloat percentX = (coordinate.longitude - self.region.center.longitude + self.region.span.longitudeDelta / 2.0) / self.region.span.longitudeDelta; CGFloat percentY = 1.0 - (coordinate.latitude - self.region.center.latitude + self.region.span.latitudeDelta / 2.0) / self.region.span.latitudeDelta; return CGPointMake(self.frame.origin.x + percentX * self.frame.size.width, self.frame.origin.y + percentY * self.frame.size.height); } 
    • 然后你可以在屏幕上添加你的点数:

       CGPoint center = [self determineCGPointFromCoordinate:coordinate]; UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"spot.png"]]; imageView.center = center; [self.view addSubview:imageView]; 

    这给我们一个看法如下:

    手册

  2. 在我看来,更容易的是重新评估你不使用地图视图的决定。

    • 您可以添加地图视图(请参阅位置感知编程指南 )

    • 把你创build的CAShapeLayer ,而不是添加作为一个子层,你可以剪辑地图到该通告CAShapeLayer

       [self.mapView.layer setMask:circleShapeLayer]; 

    而且,一旦完成了对视图的所有添加注释,就会得到如下所示的内容:

    地图工具包视图

就我个人而言,我喜欢地图工具包的方法,因为它使您摆脱了手动计算屏幕坐标的业务。 但如果你真的不想在那里的地图背景,你可以手动。

我假设你想让你的圈子随着用户的放大而增大和缩小。 那样的话,这个圈子总是会在地图上的同一片土地上。

在这种情况下,使用+circleWithCenterCoordinate:radius:创build的+circleWithCenterCoordinate:radius: ,符合MKMapViewDelegate并设置笔画并填写mapView:viewForOverlay: