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

只是要补充一点,我还注​​意到,使用新的图钉图像时,单击图钉时没有任何弹出。之前,使用默认图钉,单击图钉后会出现文本气泡。既然是这种情况,我想包括在 map 上制作和放置图钉的方法的代码,
-(void) createAndAddAnnotationForCoordinate : (CLLocationCoordinate2D)coordinate{

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

[mapView addAnnotation:annotation];


}

我还尝试更改图钉图像以查看这是否会影响 MKPinAnnotationView 的定位。虽然我可以通过编辑图像来使图钉居中,但对于其他多段线,它并未居中。任何帮助,将不胜感激!

最佳答案

首先,重要的一点是,在使用自定义注释图像时,最好使用普通的 MKAnnotationView 类,而不是其子类 MKPinAnnotationView,该类旨在自动显示标准图钉图像。

这是因为 MKPinAnnotationView 包含一些基于其自己的 pin 图像的 annotation view 的 frame 和 centerOffset 的内置调整。在某些情况下,您的自定义图像甚至会在屏幕上替换为默认的图钉图像。因此,即使 MKPinAnnotationView 具有 image 属性,该类也不会总是按预期使用它。

其次,设置 centerOffset 使得本地图被缩放时,图像“指向”坐标的部分一直指向坐标。这是因为 centerOffset 位于屏幕 CGPoint s 中,并且不会随着 map 的缩放级别进行缩放。如果 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;
}

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

这是代码和结果外观 设置 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;
}

关于ios - MKPinAnnotationView 不居中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29197476/

10-15 08:16