7

我正在尝试通过子类MKAnnotationView化和覆盖该drawRect方法来制作自定义注释视图。我希望从注释的位置偏移绘制视图,有点像这样MKPinAnnotationView做,以便引脚的点位于指定的坐标处,而不是引脚的中间。所以我设置了框架位置和大小,如下图所示。但是,看起来我根本无法影响框架的位置,只能影响大小。图像最终以注释位置为中心绘制。关于如何实现我想要的任何提示?

MyAnnotationView.h:

@interface MyAnnotationView : MKAnnotationView {

}

MyAnnotationView.m:

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        self.canShowCallout = YES;
        self.backgroundColor = [UIColor clearColor];
        // Position the frame so that the bottom of it touches the annotation position 
        self.frame = CGRectMake(0, -16, 32, 32);
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    [[UIImage imageNamed:@"blue-dot.png"] drawInRect:rect];
}
4

4 回答 4

19

我尝试使用 centerOffset 并且由于某种原因,放大时图像处于正确的位置,但是当您将地图缩小时,图像会远离它应该在的位置。解决此问题的方法是使用偏移量设置图像帧。这是我使用的代码(如果你没有标注,你可以省略标注的东西),我使用了这里的引脚)

#pragma mark MKMapViewDelegate
- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if(![annotation isKindOfClass:[MyAnnotation class]]) // Don't mess user location
        return nil;

    MKAnnotationView *annotationView = [aMapView dequeueReusableAnnotationViewWithIdentifier:@"spot"];
    if(!annotationView)
    {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"spot"];
        annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [(UIButton *)annotationView.rightCalloutAccessoryView addTarget:self action:@selector(openSpot:) forControlEvents:UIControlEventTouchUpInside];
        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;
        annotationView.centerOffset = CGPointMake(7,-15);
        annotationView.calloutOffset = CGPointMake(-8,0);
    }

    // Setup annotation view
    annotationView.image = [UIImage imageNamed:@"pinYellow.png"]; // Or whatever

    return annotationView;
}

根据需要调整 centerOffset 和 calloutOffset 以适合您的图像、所需的中心点和标注点。

于 2010-05-31T18:23:32.837 回答
16

您是否尝试过使用通用 MKAnnotationView 并设置imagecenterOffset属性,而不是子类 MKAnnotationView?

于 2010-03-19T19:28:27.547 回答
3

UIAnnotationView始终以相同的比例绘制,地图的缩放级别无关紧要。这就是为什么centerOffset不与缩放级别绑定的原因。

annView.centerOffset是你需要的。如果你发现你的图钉不在合适的位置(例如,当你改变缩放级别时,底部中心移动了一点),那是因为你没有设置正确的centerOffset.

顺便说一句,如果你想将坐标点设置在图像的底部中心,你的x坐标centerOffset应该是0.0f,因为annotationView默认居中图像。所以尝试:

annView.centerOffset = CGPointMake(0, -imageHeight / 2);

来自 [ MKAnnotation image offset with custom pin image 的回答

于 2013-03-09T16:46:08.353 回答
-3

感谢 BadPirate 的示例。

我尝试使用 UIImageview,但我认为没有必要。

我的课看起来像这样

@interface ImageAnnotationView : MKAnnotationView {
    UIImageView *_imageView;
    id m_parent;
    BusinessMapAnnotation *m_annotation;

    NSString *stitle;
}

以及实施

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    self.frame = CGRectMake(0, 0, kWidth, kHeight);
    self.backgroundColor = [UIColor clearColor];

    self.m_annotation = (BusinessMapAnnotation*)annotation;

    NSString* categoryTitle = m_annotation.sCTitle;

    NSString* l_titleString =  @"NearPin.png";

    if (categoryTitle!= nil ) {
        if ([categoryTitle length] > 0) {
            //NSLog(@"%@", categoryTitle);
            l_titleString = [NSString stringWithFormat:@"Map%@.png", categoryTitle];
            //NSLog(@"%@", l_titleString);
        }
    }

    self.stitle = m_annotation.sTitle;

    _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:([stitle isEqualToString:@"You are here"]) ? @"Pushpin_large.png":l_titleString]];
    _imageView.contentMode = UIViewContentModeCenter;

    _imageView.frame = CGRectMake(kBorder, kBorder, kWidth, kHeight);

    [self addSubview:_imageView];
    _imageView.center = ([stitle isEqualToString:@"You are here"]) ? CGPointMake(15.0, -10.0):CGPointMake(kWidth/2, 0.0);

    return self;
}
于 2011-08-04T07:14:19.127 回答