在MKMapView中围绕用户位置绘制一个半径为1000m的圆

(使用iOS 5和Xcode 4.2)

我有一个MKMapView,并希望在用户位置周围绘制一个半径为1000米的圆。

表面上看来,实现mapView:viewForAnnotation: map view委托方法,并添加一个自定义的MKAnnotationView为用户的位置,将是一个完美的解决scheme。 它看起来像这样:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { // If it's the user location, return my custom MKAnnotationView. if ([annotation isKindOfClass:[MKUserLocation class]]) { return myCustomAnnotationView; } else { return nil; } } 

但是,当您放大和缩小地图时,地图上的注释不会缩放。

所以我尝试添加覆盖图(因为覆盖图与地图缩放),使用MKCircle类并将其坐标设置为我的locationManger / map视图委托的最新坐标。 然而,由于MKCircle的坐标属性是只读的,我不得不删除覆盖,然后每次用户移动时添加一个新的。 发生明显的闪烁。

在缩放地图视图时,是否有任何方法可以无缝地进行注释比例缩放? 还是有一个很好的方式来使覆盖移动与用户位置的变化无缝的?

我会很感激你的帮助:)

尝试自定义覆盖。 添加这个viewDidLoad:

 MKCircle *circle = [MKCircle circleWithCenterCoordinate:userLocation.coordinate radius:1000]; [map addOverlay:circle]; 

userLocation可以通过将MKUserLocationAnnotation存储为一个属性来获得。 然后,要真正画圆,把它放在地图视图的委托中:

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

使用Swift的iOS 8.0的更新版本。

 import Foundation import MapKit class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{ var locationManager: CLLocationManager = CLLocationManager() @IBOutlet var mapView: MKMapView! override func viewDidLoad() { super.viewDidLoad() // We use a predefined location var location = CLLocation(latitude: 46.7667 as CLLocationDegrees, longitude: 23.58 as CLLocationDegrees) addRadiusCircle(location) } func addRadiusCircle(location: CLLocation){ self.mapView.delegate = self var circle = MKCircle(centerCoordinate: location.coordinate, radius: 10000 as CLLocationDistance) self.mapView.addOverlay(circle) } func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { if overlay is MKCircle { var circle = MKCircleRenderer(overlay: overlay) circle.strokeColor = UIColor.redColor() circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1) circle.lineWidth = 1 return circle } else { return nil } } } 

Swift 3 / Xcode 8在这里:

 func addRadiusCircle(location: CLLocation){ if let poll = self.selectedPoll { self.mapView.delegate = self let circle = MKCircle(center: location.coordinate, radius: 10) self.mapView.add(circle) } } func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { if overlay is MKCircle { let circle = MKCircleRenderer(overlay: overlay) circle.strokeColor = UIColor.red circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1) circle.lineWidth = 1 return circle } else { return MKPolylineRenderer() } } 

然后像这样打电话:

 self.addRadiusCircle(location: CLLocation(latitude: YOUR_LAT_HERE, longitude: YOUR_LNG_HERE)) 

尝试使用Apple Breadcrumb示例中的代码

我不明白benwad的答案。 所以这里是更清晰的答案 :

添加一个圆很容易。 符合MKMapViewDelegate

 @interface MyViewController : UIViewController <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *mapView; @end 

在viewDidLoad中,创build一个圆圈注释并将其添加到地图中:

 CLLocationCoordinate2D center = {39.0, -74.00}; // Add an overlay MKCircle *circle = [MKCircle circleWithCenterCoordinate:center radius:150000]; [self.mapView addOverlay:circle]; 

然后实现mapView:viewForOverlay:返回视图。

 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay { MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay]; [circleView setFillColor:[UIColor redColor]]; [circleView setStrokeColor:[UIColor blackColor]]; [circleView setAlpha:0.5f]; return circleView; } 

但是如果你想让这个圆圈始终保持相同的大小,不pipe缩放级别如何,你都需要做一些不同的事情。 就像你说的那样,在regionDidChange:animated :,获得latitudeDelta,然后创build一个新的圆(半径符合宽度),删除旧的,并添加新的。

请注意,不要忘记将视图连接到视图控制器委托。 否则viewForOverlay将不会被调用。

添加一个圆圈很容易。 符合MKMapViewDelegate。 按照波纹pipe的步骤,,,

步骤1 :

  CLLocationCoordinate2D center= {self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude}; // Add an overlay MKCircle *circle= [MKCircle circleWithCenterCoordinate:center radius: 20000];//your distance like 20000(like meters) [myMapView addOverlay:circle]; 

第2步 :

  - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay { MKCircleView *C_View = [[MKCircleView alloc] initWithOverlay:overlay]; [C_View setFillColor:[UIColor lightGrayColor]]; [C_View setStrokeColor:[UIColor blackColor]]; [C_View setAlpha:0.5f]; return C_View; } 

使用MKCircleRenderer ,你可以添加它如下。

声明叠加层及其渲染器的类级variables:

 MKCircle circleOverlay; MKCircleRenderer circleRenderer; 

实现MKMapView.OverlayRenderer为覆盖提供一个渲染器:

 mapView.OverlayRenderer = (m, o) => { if(circleRenderer == null) { circleRenderer = new MKCircleRenderer(o as MKCircle); circleRenderer.FillColor = UIColor.Green; circleRenderer.Alpha = 0.5f; } return circleRenderer; }; 

在这种情况下,创build一个叠加层,在用户位置(纬度,经度)附近放置一个圆,并将其添加到地图中:

 var coords = new CLLocationCoordinate2D(39.11, 30.13); //user location circleOverlay = MKCircle.Circle (coords, 1000); mapView.AddOverlay (circleOverlay); 
 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay 

它从iOS 4.0开始已被弃用