滚动 MKMapView 在绘制的圆圈下方 MKMapView
Scroll MKMapView Underneath Circle Drawn MKMapView
更新
我需要在 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;
}
这有效并在地图视图上生成了一个圆圈。但是,当我滚动地图视图时,圆圈会随之移动。 我希望圆圈保持静止并让地图视图在圆圈下方滚动。
需要注意的是,我需要获取圆的中心坐标和半径才能创建 region。出于这个原因,我不能简单地在 MKMapView 之上绘制一个 UIView,因为我无法获得以米为单位的 UIView 的半径。
我解决了!
第 1 步:
我创建了一个 UIView
并将其作为子视图添加到地图视图中。重要的是要注意,我确保 UIView
在地图视图上居中。这很重要,因为您将使用 MKMapView
的 centerCoordinate
属性 来计算半径。
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];
下图显示了作为子视图添加到 mapView
的圆形 UIView
。
第 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
是您创建的用于表示半径的自定义圆
更新
我需要在 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;
}
这有效并在地图视图上生成了一个圆圈。但是,当我滚动地图视图时,圆圈会随之移动。 我希望圆圈保持静止并让地图视图在圆圈下方滚动。
需要注意的是,我需要获取圆的中心坐标和半径才能创建 region。出于这个原因,我不能简单地在 MKMapView 之上绘制一个 UIView,因为我无法获得以米为单位的 UIView 的半径。
我解决了!
第 1 步:
我创建了一个 UIView
并将其作为子视图添加到地图视图中。重要的是要注意,我确保 UIView
在地图视图上居中。这很重要,因为您将使用 MKMapView
的 centerCoordinate
属性 来计算半径。
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];
下图显示了作为子视图添加到 mapView
的圆形 UIView
。
第 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
是您创建的用于表示半径的自定义圆