滚动MKMapView圆圈下方绘制MKMapView

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (5)

UPDATE

我需要在a上绘制一个圆MKMapView,在这里我可以得到圆的半径和它的中心坐标。但是,我还希望将圆圈作为其子视图MKMapView,以便地图视图可以在圆形下方滚动,在地图移动时更新其中心坐标,并在地图放大和缩小时更新其半径。

有谁知道我怎么能够做到这一点?

这是问题的原始措辞

MKMapView使用下面的代码画了一个圆圈:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    self.region = [MKCircle circleWithCenterCoordinate:self.locationManager.location.coordinate radius:kViewRegionDefaultDistance];
    [self.mapView addOverlay:self.region];
}

- (MKOverlayPathRenderer *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay
{
    MKCircleRenderer *region = [[MKCircleRenderer alloc] initWithOverlay:overlay];
    region.strokeColor = [UIColor blueColor];
    region.fillColor = [[UIColor blueColor] colorWithAlphaComponent:0.4];
    return region;
}

这适用于地图视图并生成一个圆。但是,当我滚动地图视图时,圆圈随之移动。我希望圆圈保持静止,并让地图视图滚动到圆圈下方。

重要的是要注意,我需要获得圆的中心坐标和半径,以便创建一个区域。出于这个原因,我不能简单地在MKMapView上绘制UIView,因为我无法获得UIView的半径。

提问于
用户回答回答于

我解决了!

步骤1:

我创建了一个UIView并将其作为子视图添加到地图视图中。重要的是要注意,我确保UIView将地图放在地图视图上。这很重要,因为您将使用计算半径的centerCoordinate属性MKMapView

self.region = [[UIView alloc] initWithFrame:centerOfMapViewFrame];
self.region.contentMode = UIViewContentModeRedraw;
self.region.userInteractionEnabled = NO;
self.region.alpha = 0.5;
self.region.layer.cornerRadius = widthOfView/2;
self.region.backgroundColor = [UIColor blueColor];

[self.mapView addSubview:self.region];

下图显示了UIView作为子视图添加的圆形mapView

第2步:

根据地图视图的中心坐标和UIView的边缘坐标计算半径。

CLLocationCoordinate2D edgeCoordinate = [self.mapView convertPoint:CGPointMake((CGRectGetWidth(self.region.bounds)/2), 0) toCoordinateFromView:self.region]; //self.region is the circular UIView

CLLocation *edgeLocation = [[CLLocation alloc] initWithLatitude:edgeCoordinate.latitude longitude:edgeCoordinate.longitude];
CLLocation *centerLocation = [[CLLocation alloc] initWithLatitude:self.mapView.centerCoordinate.latitude longitude:self.mapView.centerCoordinate.longitude];

CGFloat radius = [edgeLocation distanceFromLocation:centerLocation]; //is in meters

下图显示了edgeLocation和上的注释centerLocation

用户回答回答于

Swift 4.2 / 5改编

let edgeCoordinate = self.mapView.convert(mapView.center, toCoordinateFrom: overlayView)

let edgeLocation: CLLocation = .init(latitude: edgeCoordinate.latitude, longitude: edgeCoordinate.longitude)

let centerLocation: CLLocation = .init(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)

let radius = edgeLocation.distance(from: centerLocation)

// do something with the radius

overlayView您创建的自定义圆圈在哪里表示半径

所属标签

可能回答问题的人

  • 天使的炫翼

    15 粉丝531 提问35 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券