我目前正在使用mapkit并且卡住了.
我有一个我正在使用的自定义注释视图,我想使用image属性在我自己的图标上显示地图上的点.我有这个工作正常.但我还想做的是覆盖默认的标注视图(触摸注释图标时显示标题/副标题的气泡).我希望能够控制标注本身:mapkit只提供对左右辅助标注视图的访问,但是没有办法为标注泡泡提供自定义视图,或者给它零大小或其他任何东西.
我的想法是覆盖我的selectAnnotation/deselectAnnotation MKMapViewDelegate,然后通过调用我的自定义注释视图来绘制我自己的自定义视图.这有效,但只有在我的自定义注释视图类中canShowCallout设置时才有效YES.如果我将此设置为NO(这是我想要的,那么不会调用这些方法,因此不会绘制默认的标注气泡).所以我无法知道用户是否在地图上触摸了我的点(选中它)或触摸了一个不属于我的注释视图(被选中)的点而没有显示默认的标注气泡视图.
我试着走另一条路,只是自己在地图上处理所有触摸事件,我似乎无法让这个工作.我在地图视图中阅读了与捕捉触摸事件相关的其他帖子,但它们并不完全是我想要的.有没有办法挖掘地图视图以在绘制之前删除标注气泡?我不知所措.
有什么建议?我错过了一些明显的东西吗
(使用iOS 5和Xcode 4.2)
我有一个MKMapView,想在用户位置周围绘制一个1000米半径的圆.
从表面上看,似乎实现mapView:viewForAnnotation: map view delegate方法,并为用户位置添加自定义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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当您放大和缩小地图时,地图上的注释不会缩放.
所以我尝试添加叠加层(因为叠加层与地图一起缩放),使用MKCircle类并将其坐标设置为来自locationManger/map视图委托的最新坐标.但是由于MKCircle 的坐标属性是readonly,我不得不删除叠加层,然后每次用户移动时添加一个新叠加层.当它发生时引起明显的闪烁.
当地图视图缩小和缩小时,有没有办法无缝地制作注释比例?或者是否有一种很好的方法可以使叠加层随着用户位置的变化无缝移动?
我非常感谢你的帮助:)
我有一个MKAnnotation与自定义图钉图像.但是,引脚(MKAnnotationView)使图像相对于指定的坐标居中.我想将坐标点设置在图像的底部中心,而不是中心.
我试过用了annView.centerOffset = CGPointMake(-12, -28);.但问题是centerOffset与地图缩放级别无关.
可以在JS API和Android中执行此操作.有没有可能在objective-c中这样做?
..fredrik
我想创建一个自定义的MKAnnotationView标注,如图所示.我已经测试了几种解决方案,但它们只允许自定义左/右图像和标题/副标题.有人可以给我一些源代码或教程链接吗?
目前我很无能为力.请帮忙.

我仍然对iOS的东西很新,并且在测试我们的App for iOS 8兼容性时发现了一个问题.在iOS 7中一切正常,但在iOS 8上,rightCalloutAccessoryView在某些情况下未对齐.
第一个截图:正确对齐 
第二个屏幕截图:错误对齐 
如您所见,当InfoWindow具有较长的标题时会发生问题.但是在iOS 7上并非如此,我找不到任何提及这已经发生变化的事情?
我试图理解为什么并找到解决这个问题的方法,但还找不到任何东西.这是我们自己可以解决的还是我们必须为Apple提出问题?
任何帮助/想法都会受到高度赞赏,因为我对这个问题有点过分挑战.
添加MKAnnotationViews的代码
- (MKAnnotationView *)viewForStation:(id<MKAnnotation>)annotation {
static NSString *stationIdentifier = @"stao";
MKAnnotationView *annotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:stationIdentifier];
if (annotationView == nil) {
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:stationIdentifier];
annotationView.image = [UIImage bundleImageNamed:PIN_IMAGE];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
}
return annotationView;
}
Run Code Online (Sandbox Code Playgroud)
您可能感兴趣,我(刚才)也将此问题添加到apple.developer.com上的iOS 8 Beta部分:https://devforums.apple.com/thread/242282 ? tstart = 0
如果我在这里或在apple.developer.com上得到答案,我会反映它,以便我们可以在两个网站上找到它
从iOS 7到8,我的代码运行良好.昨天更新了我的引脚上的自定义图像被标准引脚图像替换.有什么建议?
我的代码:
extension ViewController: MKMapViewDelegate {
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView! {
if annotation is MKUserLocation {
return nil
}
let reuseId = String(stringInterpolationSegment: annotation.coordinate.longitude)
var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if pinView == nil {
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
pinView!.image = getRightImage(annotation.title!!)
}
let button = UIButton(type: UIButtonType.DetailDisclosure)
pinView?.rightCalloutAccessoryView = button
return pinView
}
}
Run Code Online (Sandbox Code Playgroud)
获取图像的函数UIImage根据名称返回:
func getRightImage (shopName:String)-> UIImage{
var correctImage = UIImage()
switch shopName
{
case …Run Code Online (Sandbox Code Playgroud) 我设法在Swift中获得了注释引脚的自定义图标,但现在我仍然使用2个不同的图像进行不同的注释.现在,按钮会向地图添加注释.应该有另一个按钮,它还添加了注释,但带有另一个图标.
有没有办法使用reuseId?
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var Map: MKMapView!
@IBAction func btpressed(sender: AnyObject) {
var lat:CLLocationDegrees = 40.748708
var long:CLLocationDegrees = -73.985643
var latDelta:CLLocationDegrees = 0.01
var longDelta:CLLocationDegrees = 0.01
var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta)
var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, long)
var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)
Map.setRegion(region, animated: true)
var information = MKPointAnnotation()
information.coordinate = location
information.title = "Test Title!"
information.subtitle = "Subtitle"
Map.addAnnotation(information)
}
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
if !(annotation is MKPointAnnotation) …Run Code Online (Sandbox Code Playgroud) 更新#5我想这是赏金时间.即使使用我发布的代码示例,也有100多个视图并且没有人被刺穿.一些声望点怎么样!
更新#4这是一个非常复杂的问题,所以我创建了一个新的基于选项卡的项目,其中包含我的应用程序的部分,我在这里遇到了麻烦.您可以从以下网址下载:http://www.servinitup.net/CustomCalloutAnnotation.zip 随意打开它(需要添加自己的包标识符才能在手机上运行)并玩它,看看你是否可以得到那个darned标注注释随着针移动!
更新#3尝试使setAnnotation成为教程的CalloutMapAnnotationView的公共方法并直接调用它.没有运气.尽管发生了一些奇怪的事情,唯一感动的是标注的小三角形部分.我无法让整个标注移动.
更新#2仍然没有多少运气,但现在一直在寻找以编程方式创建"缩放到缩放"然后立即撤消它的方法,因此用户永远不会看到更改.希望以编程方式执行此操作与手动执行此操作具有相同的效果,并且callout注释将弹回到它的父级.有任何想法吗?
更新#1在这里玩了之后我已经得到了: - 替换self.calloutAnnotation.coordinate = coords;为self.calloutAnnotation.latitude = coords.latitude;self.calloutAnnotation.longitude = coords.longitude;
- 随着更改,如果我稍微捏住地图以在引脚更新后放大或缩小,则标注注释会动画到正确的位置,正好在针.
所以现在我需要弄清楚如何在没有用户实际捏缩放的情况下实现这一点.
原帖
我和其他SO用户一起使用这个非常棒的解决方案来创建自定义标注注释:http: //blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/
当您使用标准标注(annotationview.canShowCallout = true)并且当位置更新时,引脚在屏幕上移动,标准标注随着引脚一起跟踪,就像它们被锁定在一起一样.
使用上面的自定义标注解决方案时,当我的图钉在位置更新后移动时,标注注释将保留在其原始位置.当然,我想模仿iOS标准,并有自定义标注注释轨道和引脚.
这是我到目前为止的代码,它成功地移动了注释视图,但不是自定义的callout注释视图:
/* core location broadcasts a notification, and my view controller listens to that notification and calls locationManagerDidFindLocation */
- (void)locationManagerDidFindLocation:(NSNotification *)notif {
CLLocation *location = [notif.userInfo objectForKey:@"location"];
CLLocationCoordinate2D coords = [location coordinate];
MKCoordinateSpan span = MKCoordinateSpanMake((5/69), (5/69));
MKCoordinateRegion region = … 我有一个自定义的MKAnnotationView,我在viewForAnnotation中自己设置我的图像.我如何使用MKPinAnnotationView为它设置动画效果?
我的代码是
- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
{
static NSString *AnnotationViewID = @"annotationViewID";
MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
if (annotationView == nil)
{
annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease];
}
annotationView.image = [UIImage imageNamed:@"blah.png"];
annotationView.annotation = annotation;
return annotationView;
}
Run Code Online (Sandbox Code Playgroud) cocoa-touch mapkit mkpinannotationview mkannotationview ios-4.2
我做了一个演示项目(来自github上的Moving-MKAnnotationView演示),用于在地图上移动汽车以下是它的链接
https://github.com/pratikbhiyani/Moving-MKAnnotationView
我在vinaut的给定答案的基础上编辑我的代码,但问题是,当我们缩放或滚动地图动画时,在我们缩放或滚动地图注释设置为其原始角度一段时间时,在ios 7和ios 6中分散注意力.
下面是我的演示项目的屏幕截图

这是我改变的一些代码
- (void) setPosition : (id) posValue;
{
NSLog(@"set position");
//extract the mapPoint from this dummy (wrapper) CGPoint struct
MKMapPoint mapPoint = *(MKMapPoint*)[(NSValue*)posValue pointerValue];
CLLocationCoordinate2D coord = MKCoordinateForMapPoint(mapPoint);
CGPoint toPos;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
toPos = [self.mapView convertCoordinate:coord toPointToView:self.mapView];
}
else
{
CGFloat zoomFactor = self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
toPos.x = mapPoint.x/zoomFactor;
toPos.y = mapPoint.y/zoomFactor;
}
[self setTransform:CGAffineTransformMakeRotation([self getHeadingForDirectionFromCoordinate:MKCoordinateForMapPoint(previousPoint) toCoordinate: MKCoordinateForMapPoint(mapPoint)])];
if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; …Run Code Online (Sandbox Code Playgroud) mkannotationview ×10
mkmapview ×7
ios ×6
mapkit ×5
iphone ×4
objective-c ×4
cocoa-touch ×1
google-maps ×1
ios-4.2 ×1
ios5 ×1
ios8 ×1
ios9 ×1
ipad ×1
mkannotation ×1
mkoverlay ×1
swift ×1