(使用 iOS 5 和 Xcode 4.2)
我有一个 MKMapView,想要围绕用户位置绘制一个半径为 1000m 的圆。
从表面上看,似乎实现 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/地图视图委托中的最新坐标。然而,作为 坐标属性 MKCircle 是只读的,我必须删除覆盖层,然后每次用户移动时添加一个新的覆盖层。发生时会引起明显的闪烁。
有什么方法可以在地图视图缩放时无缝地进行注释缩放吗?或者有没有一种好方法可以使叠加层随着用户位置的变化而无缝移动?
我将非常感谢您的帮助:)
(Using iOS 5 and Xcode 4.2)
I have an MKMapView and want to draw a circle of 1000m radius around the user location.
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:
- (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 MKCircle class and setting its co-ordinates to the latest co-ordinates from my locationManger/map view delegate. However as the coordinate property of 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.
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 :)
发布评论
评论(8)
尝试自定义叠加层。在 viewDidLoad 中添加:
可以通过将 MKUserLocationAnnotation 存储为属性来获取 userLocation。然后,要实际绘制圆圈,请将其放入地图视图的委托中:
Try a custom overlay. Add this in viewDidLoad:
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:
使用 Swift 的 iOS 8.0 更新版本。
An updated version for iOS 8.0 using Swift.
Swift 3/ Xcode 8 在这里:
然后像这样调用:
Swift 3/ Xcode 8 here:
Then call like so:
尝试使用 Apple Breadcrumb 示例 中的代码
Try to use the code from Apple Breadcrumb example
我不明白本瓦德的回答。 所以这是更清晰的答案 :
添加圆圈非常容易。符合 MKMapViewDelegate
在 viewDidLoad 中,创建一个圆形注解并将其添加到地图中:
然后实现 mapView:viewForOverlay: 返回视图。
但是,如果您希望圆圈始终具有相同的大小,无论缩放级别如何,您都必须做一些不同的事情。就像你说的,在regionDidChange:animated:中,获取latitudeDelta,然后创建一个新的圆(半径适合宽度),删除旧的并添加新的。
我的注释:不要忘记将 MapView 与视图控制器委托连接。否则 viewForOverlay 将不会被调用。
I didn't understand benwad answer. So here is clearer answer:
It's pretty easy to add a circle. Conform to MKMapViewDelegate
In viewDidLoad, Create a circle annotation and add it to the map:
Then implement mapView:viewForOverlay: to return the view.
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.
Note from me: don't forget to connect mapview with your view controller delegate. Otherwise viewForOverlay won't be called.
我所做的就是,在地图套件上显示位置后,最后调用以下函数。
All I did is, After displaying the location on the map kit called the below function in the end.
添加圆圈很容易。符合 MKMapViewDelegate。
请按照以下步骤操作,,,
步骤 1:
步骤 2:
It's easy to add a circle. Conform to MKMapViewDelegate.
follow the bellow steps,,,
Step 1 :
Step 2 :
自 iOS 4.0 起已弃用
it is deprecated since iOS 4.0