2012-01-29 51 views
51

(使用的是iOS 5和Xcode的4.2)绘制千米半径围绕用户位置的圆圈中的MKMapView

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

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

- (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的coordinate property是只读的,我不得不移除叠加层,然后在用户每次移动时添加一个新叠加层。碰巧引起明显的闪烁。

有没有什么方法可以在地图视图缩放时无缝制作注记比例?或者,有没有一种方法可以使覆盖层随用户位置的变化而无缝移动?

我会是你的帮助:)

+7

我觉得一个自定义的覆盖和叠加的观点是,你需要什么(这是什么@Flink似乎暗示)。但是,更接近您要求的Apple示例是WWDC 2010中的LocationReminders应用程序。如果您是注册开发人员,则可以在[此处]找到它(http://connect.apple.com/cgi-bin/WebObjects/MemberSite .woa/WA/getSoftware?代码= Y&源= X&bundleID = 20645)。它自定义绘制一个大小和位置可以动态变化的圆形覆盖图。 – Anna 2012-01-30 02:23:17

+0

感谢您的链接,听起来就像我需要的例子。另外我是注册开发者,所以这很方便:) – 2012-01-30 02:59:57

+0

链接已损坏,但我发现这在github上:https://github.com/master-nevi/WWDC-2010/tree/master/LocationReminders – foson 2017-12-30 23:21:42

回答

3

尝试使用代码Apple Breadcrumb example

+0

我不是确定Breadcrumb示例将如何解决MKCirecle移动问题。 – user836026 2012-05-08 18:41:38

+1

你可以画出自己的圈子 – Shmidt 2012-05-08 18:47:30

+0

我不知道如何使用crumbPath来做到这一点。 – user836026 2012-05-08 19:25:36

74

尝试自定义背景画面非常感谢。在viewDidLoad中添加此:

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

用户位置可以通过存储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; 
} 
+0

每当用户位置变化时移动圆圈 – 2013-06-04 12:11:53

+0

我们如何移动圆圈?我们需要在每次移动时创建一个新的MKCircle? – yuf 2013-12-12 00:59:04

+0

需要iOS 7更新! – Hyperbole 2014-03-27 01:35:52

39

使用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 
     } 
    } 
} 
+2

无法在'mapView:rendererfForOverlay'中返回'nil'参见修复:http://stackoverflow.com/a/32452494/723980 – 2016-03-05 19:31:23

+0

rendererForOverlay被替换为rendererFor – Guy 2017-04-03 10:21:16

2

我不明白benwad的答案。 So here is clearer answer

添加一个圆很容易。顺应MKMapViewDelegate

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

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

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; 
} 

但是如果你想圆始终是相同的大小,无论缩放级别,你必须做不同的事情。就像你说的,在regionDidChange:animated :,获取latitudeDelta,然后创建一个新的圆(半径符合宽度),删除旧的并添加新的圆。

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

0

很容易添加一个圆圈。符合MKMapViewDelegate。 按下面的步骤,,,

第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; 
} 
0
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay 

并且,由于过时的iOS 4.0

0

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

的覆盖

声明类级的变量和它的渲染:

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; 
}; 

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

var coords = new CLLocationCoordinate2D(39.11, 30.13); //user location 
circleOverlay = MKCircle.Circle (coords, 1000); 
mapView.AddOverlay (circleOverlay); 
11

斯威夫特3/8的Xcode在这里:

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)) 
+0

什么是'self.selectedPoll?'哪里来了?从 – BlueBoy 2017-08-05 23:43:32

+0

@ thexande半径:10,这里10包含哪个值?我的意思是以英里或米或千米为单位。 – 2018-01-20 05:11:40

相关问题