MKPinAnnotationView不居中

3

在为MKPinAnnotationView上传自定义图像后,我发现大头针偏离了中心。大头针应该位于路线折线的某一点上,并位于mkcircle的中心;然而,大头针似乎在折线的右侧和中心的略北位置。我尝试使用centerOffset属性进行实验,但是当我将值插入该属性时,似乎没有任何变化。下面是代码:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

static NSString *viewID = @"MKPinAnnotationView";
MKPinAnnotationView *annotationView = (MKPinAnnotationView*)
[self.mapView dequeueReusableAnnotationViewWithIdentifier:viewID];

if(annotationView ==nil){
    annotationView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:viewID];
}


annotationView.image = [UIImage imageNamed:@"Pin.png"];
annotationView.enabled = YES;

//doesn't move the pin, still offcentered
annotationView.centerOffset = CGPointMake(0,-50);
return annotationView;
 }

有一点需要补充的是,我还注意到使用新的图钉图片时,单击图钉时不会弹出任何内容。之前,使用默认的图钉时,单击图钉后会出现一个文本气泡。因此,我想包含制作并放置地图上图钉的方法的代码。

-(void) createAndAddAnnotationForCoordinate : (CLLocationCoordinate2D)coordinate{

MKPointAnnotation* annotation = [[MKPointAnnotation alloc]init];
annotation.coordinate = coordinate;
annotation.title = @"This is a pin!";

[mapView addAnnotation:annotation];


}

我还尝试更改图钉图像,看看是否会影响MKPinAnnotationView的定位。虽然我能够通过编辑图像来居中图钉,但对于其他折线而言,它并没有居中。如果您能提供任何帮助,将不胜感激! 图钉图片 与路线、折线和圆圈相关的图钉图片

如果您想使用自定义图像,请创建一个普通的MKAnnotationView(而不是MKPinAnnotatioView)。这可能也可以修复居中问题。要在点击时激活气泡,请执行annotationView.canShowCallout = YES。 - user467105
谢谢您的回复,Anna。将其更改为MKAnnotationView确实解决了标注问题,但是标注仍然偏离中心。我尝试使用centeroffSet和center属性,但是当我调整它们时,标注似乎并没有移动。 - Chris Gong
请注意,centerOffset 不会随着地图缩放级别而缩放。它是一个固定值,因此您必须设置它,以便图像中应该粘贴到实际坐标的点保持不变。将其更改为 MKAnnotationView 与弹出窗口无关(设置 canShowCallout 即可)。 - user467105
我不确定我是否阅读正确,但是没有办法移动注释吗?如果有帮助的话,注释位于mkcircle中心稍右侧。 - Chris Gong
请编辑问题并发布Pin.png以及注释在地图上相对于圆圈的外观的小截图。 - user467105
好的,我已经添加了你要求的图片! - Chris Gong
2个回答

11

首先,一个重要的点是,在使用自定义注释图像时,最好使用普通的MKAnnotationView类,而不是它的子类MKPinAnnotationView,后者被设计为自动显示标准的大头针图像。

这是因为MKPinAnnotationView包括一些内置的调整注释视图的框架和centerOffset,基于它自己的大头针图像。在某些情况下,您的自定义图像甚至会在屏幕上被默认的大头针图像替换。因此,即使MKPinAnnotationView有一个image属性,该类也不总是按预期使用它。

其次,设置centerOffset,使得随着地图缩放,指向坐标的图像部分始终指向坐标。这是因为centerOffset在屏幕CGPoint中,并且不随地图的缩放级别而缩放。如果centerOffset没有正确设置,图像的“指针”将开始从目标坐标漂移。

请注意,您甚至可能不需要设置centerOffset,因为默认设置会将图像的中心放置在您可能满意的坐标处。


根据您发布的图片,以下是代码和结果外观未设置centerOffset(保持默认)

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

    static NSString *viewID = @"MKPinAnnotationView";

    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:viewID];

    if (annotationView ==nil) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewID];
        annotationView.image = [UIImage imageNamed:@"Pin.png"];
        annotationView.canShowCallout = YES;
    }
    else {
        annotationView.annotation = annotation;
    }

    return annotationView;
}

enter image description here

(我添加了红色中心线以显示目标坐标相对于引脚图像的位置。)


这是代码和结果外观,使用设置centerOffset 使底部指向该坐标:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

    static NSString *viewID = @"MKPinAnnotationView";

    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:viewID];

    if (annotationView ==nil) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewID];
        annotationView.image = [UIImage imageNamed:@"Pin.png"];
        annotationView.canShowCallout = YES;
        annotationView.centerOffset = CGPointMake(0,-15);
    }
    else {
        annotationView.annotation = annotation;
    }

    return annotationView;
}

enter image description here


感谢您提供结构良好的答案!我已更改了我的代码,但是centerOffset似乎没有起作用。我很困惑为什么centerOffset属性不起作用。图钉仍然在完全相同的位置。 - Chris Gong
我知道已经过了几天,但我仍然无法找到解决方案。当我为centeroffset属性输入任何值时,似乎没有任何变化。请帮忙! - Chris Gong
很奇怪,因为calloutOffset可以工作,但centerOffset却不能。 - Chris Gong

2

您需要设置MKCoordinateRegion来加载地图,将您的createAndAddAnnotationForCoordinate方法编辑如下:

-(void) createAndAddAnnotationForCoordinate : (CLLocationCoordinate2D)coordinate{

MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(coordinate, 3000, 3000); //Set zooming level
    MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion]; //add location to map
    [mapView setRegion:adjustedRegion animated:YES]; // create animation zooming

MKPointAnnotation* annotation = [[MKPointAnnotation alloc]init];
annotation.coordinate = coordinate;
annotation.title = @"This is a pin!";

[mapView addAnnotation:annotation];


}

谢谢您的回复。MKCoordinateRegion已经成功加载,您添加的代码已经在我的viewdidLoad方法中了。但是,图钉仍然偏离中心,标题也没有显示出来。然而,如果我去掉重写的viewForAnnotation方法,那么带有默认图像的图钉就会居中,并弹出标题。 - Chris Gong
在viewForAnnotation方法返回annotationView之前,请尝试执行以下代码: annotationView.center = CGPointMake(annotationView.bounds.size.width0.1f, -annotationView.bounds.size.height0.5f); - DilumN
我添加了一行代码,但是引脚仍然居中偏移。代码似乎没有移动引脚。 - Chris Gong
然后尝试这个,UIImage *pin = [UIImage imageNamed:@"Pin.png"];annotationView.center = CGPointMake(pin.size.width*0.1f, -pin.size.height*0.5f); - DilumN
不幸的是,额外的代码对引脚位置没有影响。 - Chris Gong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接