在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开始已被弃用