MKPinAnnotationView 未居中
MKPinAnnotationView not centered
为 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 的定位。尽管我能够通过编辑图像使图钉居中,但它并没有以其他多段线为中心。如有任何帮助,我们将不胜感激!
您必须设置 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];
}
首先,很重要的一点是,在使用自定义注释图像时,最好使用plain MKAnnotationView
class 而不是它的subclass MKPinAnnotationView
which旨在自动显示标准图钉图像。
这是因为 MKPinAnnotationView
包括一些基于其自身图钉图像的注释视图框架和 centerOffset 的内置调整。在某些情况下,您的自定义图像甚至会在屏幕上被默认的图钉图像替换。因此,即使 MKPinAnnotationView
有一个 image
属性,class 也不会总是按预期使用它。
其次,设置centerOffset
,使地图缩放时,图像中"points"坐标的部分始终指向坐标。这是因为 centerOffset
在屏幕 CGPoint
s 中并且不随地图的缩放级别缩放。如果centerOffset
设置不当,图像的"point"会开始偏离目标坐标。
另请注意,您甚至可能不需要设置 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;
}
为 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 的定位。尽管我能够通过编辑图像使图钉居中,但它并没有以其他多段线为中心。如有任何帮助,我们将不胜感激!
您必须设置 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];
}
首先,很重要的一点是,在使用自定义注释图像时,最好使用plain MKAnnotationView
class 而不是它的subclass MKPinAnnotationView
which旨在自动显示标准图钉图像。
这是因为 MKPinAnnotationView
包括一些基于其自身图钉图像的注释视图框架和 centerOffset 的内置调整。在某些情况下,您的自定义图像甚至会在屏幕上被默认的图钉图像替换。因此,即使 MKPinAnnotationView
有一个 image
属性,class 也不会总是按预期使用它。
其次,设置centerOffset
,使地图缩放时,图像中"points"坐标的部分始终指向坐标。这是因为 centerOffset
在屏幕 CGPoint
s 中并且不随地图的缩放级别缩放。如果centerOffset
设置不当,图像的"point"会开始偏离目标坐标。
另请注意,您甚至可能不需要设置 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;
}