ios 在 MKMapView 中围绕用户位置绘制一个半径为 1000m 的圆圈
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9056451/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Draw a circle of 1000m radius around users location in MKMapView
提问by Jon Cox
(Using iOS 5 and Xcode 4.2)
(使用 iOS 5 和 Xcode 4.2)
I have an MKMapView and want to draw a circle of 1000m radius around the user location.
我有一个 MKMapView 并且想在用户位置周围绘制一个半径为 1000m 的圆。
On the surface it would seem that implementing the mapView:viewForAnnotation:map view delegate method, and adding a custom MKAnnotationView for the users location, would be a perfect solution. It would look something like this:
从表面上看,实现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;
}
}
However annotations on the map don't scale when you zoom in and out of the map.
但是,当您放大和缩小地图时,地图上的注释不会缩放。
So I tried adding an overlay (because overlays scale with the map), using the MKCircleclass and setting its co-ordinates to the latest co-ordinates from my locationManger/map view delegate. However as the coordinate propertyof MKCircle is readonly, I'm having to remove the overlay then add a new one each time the user moves. Causing a noticeable flicker as it happens.
所以我尝试添加一个叠加层(因为叠加层随地图缩放),使用MKCircle类并将其坐标设置为来自我的 locationManger/地图视图委托的最新坐标。但是,由于MKCircle的坐标属性是只读的,我必须删除叠加层,然后在每次用户移动时添加一个新叠加层。发生时会引起明显的闪烁。
Is there any way to make an annotation scale seamlessly as the map view is scaled in and out? Or is there a good way to make an overlay move seamlessly with changes in the users location?
有没有办法在地图视图缩放时无缝地制作注释比例?或者是否有一种好方法可以使叠加层随着用户位置的变化而无缝移动?
I would be very grateful for your help :)
我将非常感谢您的帮助:)
回答by benwad
Try a custom overlay. Add this in viewDidLoad:
尝试自定义叠加层。在 viewDidLoad 中添加:
MKCircle *circle = [MKCircle circleWithCenterCoordinate:userLocation.coordinate radius:1000];
[map addOverlay:circle];
userLocation can be obtained by storing the MKUserLocationAnnotation as a property. Then, to actually draw the circle, put this in the map view's delegate:
可以通过将 MKUserLocationAnnotation 存储为属性来获取 userLocation。然后,要实际绘制圆圈,请将其放入地图视图的委托中:
- (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;
}
回答by vladCovaliov
An updated version for iOS 8.0 using Swift.
使用 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
}
}
}
回答by thexande
Swift 3/ Xcode 8 here:
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()
}
}
Then call like so:
然后像这样调用:
self.addRadiusCircle(location: CLLocation(latitude: YOUR_LAT_HERE, longitude: YOUR_LNG_HERE))
回答by Shmidt
Try to use the code from Apple Breadcrumb example
尝试使用Apple Breadcrumb 示例中的代码
回答by RealNmae
I didn't understand benwad answer. So here is clearer answer:
我不明白本瓦德的回答。所以这里有更明确的答案:
It's pretty easy to add a circle. Conform to MKMapViewDelegate
添加一个圆圈非常容易。符合 MKMapViewDelegate
@interface MyViewController : UIViewController <MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@end
In viewDidLoad, Create a circle annotation and add it to the map:
在 viewDidLoad 中,创建一个圆注释并将其添加到地图中:
CLLocationCoordinate2D center = {39.0, -74.00};
// Add an overlay
MKCircle *circle = [MKCircle circleWithCenterCoordinate:center radius:150000];
[self.mapView addOverlay:circle];
Then implement mapView:viewForOverlay: to return the view.
然后实现 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;
}
But if you want the circle to always be the same size, no matter the zoom level, you'll have to do something different. Like you say, in regionDidChange:animated:, get the latitudeDelta, then create a new circle (with a radius that fits into the width), remove the old one and add the new one.
但是,如果您希望圆圈始终大小相同,则无论缩放级别如何,您都必须做一些不同的事情。就像你说的,在 regionDidChange:animated: 中,获取 latitudeDelta,然后创建一个新圆(半径适合宽度),删除旧圆并添加新圆。
Note from me: don't forget to connect mapview with your view controller delegate. Otherwise viewForOverlay won't be called.
我的注意事项:不要忘记将 mapview 与您的视图控制器委托连接。否则 viewForOverlay 不会被调用。
回答by Kupendiran iOS
It's easy to add a circle. Conform to MKMapViewDelegate. follow the bellow steps,,,
添加圆圈很容易。符合 MKMapViewDelegate。按照以下步骤,,,
Step 1 :
第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];
Step 2 :
第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;
}
回答by e a
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
it is deprecated since iOS 4.0
自 iOS 4.0 起已弃用
回答by prajna kunder
All I did is, After displaying the location on the map kit called the below function in the end.
我所做的就是,在地图工具箱上显示位置后,最后调用了下面的函数。
@IBOutlet weak var mapView: GMSMapView!
var cirlce: GMSCircle!
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
circleview(redius: 5000)
}
//used this func to draw the circle
func circleview(redius:Double) {
let circleCenter = CLLocationCoordinate2D(latitude: 13.3450223, longitude: 74.7512519)
cirlce = GMSCircle(position: circleCenter, radius: redius)
cirlce.fillColor = UIColor(red: 230.0/255.0, green: 230.0/255.0, blue: 250.0/255.0, alpha:1.0)
cirlce.strokeColor = .blue
cirlce.strokeWidth = 2
cirlce.map = mapView
}