MKAnnotationView drawRect:没有被调用

Posted

技术标签:

【中文标题】MKAnnotationView drawRect:没有被调用【英文标题】:MKAnnotationView drawRect: not getting called 【发布时间】:2011-04-05 20:54:07 【问题描述】:

我已经实现了一个从 MKAnnotation 派生的自定义注解,称为 ContainerAnnotation,以及一个从 MKAnnotationView 派生的自定义注解视图,使用 drawRect: 方法,称为 ContainerAnnotationView。由于某种原因,drawRect: 方法没有被调用,我不知道为什么。

这是我的注释视图的源代码。

ContainerAnnotationView.h:

@interface ContainerAnnotationView : MKAnnotationView



@end

ContainerAnnotationView.m:

@implementation ContainerAnnotationView

- (void) drawRect: (CGRect) rect

    // Draw the background image.
    UIImage * backgroundImage = [UIImage imageNamed: @"container_flag_large.png"];
    CGRect annotationRectangle = CGRectMake(0.0f, 0.0f, backgroundImage.size.width, backgroundImage.size.height);
    [backgroundImage drawInRect: annotationRectangle];

    // Draw the number of annotations.
    [[UIColor whiteColor] set];
    UIFont * font = [UIFont systemFontOfSize: [UIFont smallSystemFontSize]];
    CGPoint point = CGPointMake(2, 1);
    ContainerAnnotation * containerAnnotation = (ContainerAnnotation *) [self annotation];
    NSString * text = [NSString stringWithFormat: @"%d", containerAnnotation.annotations.count];
    [text drawAtPoint: point withFont: font];


@end

从我的视图控制器:

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


    if ([annotation isKindOfClass: [ContainerAnnotation class]])
    
        ContainerAnnotationView * annotationView = (ContainerAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier: _containerMapAnnotationId];
        if (annotationView == nil)
        
            annotationView = [[[ContainerAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: _containerMapAnnotationId] autorelease];     
            annotationView.centerOffset = CGPointMake(0, -17.5);
            annotationView.rightCalloutAccessoryView = [UIButton buttonWithType: UIButtonTypeDetailDisclosure];
            annotationView.canShowCallout = YES;
        
        annotationView.annotation = annotation;

        return annotationView;
    
    // etc...

我还有其他注释使用普通的 MKAnnotation 和一个可以正常工作的图像。我还有另一个没有实现 drawRect 的自定义注释视图:工作正常。知道我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:

问题原来是我的 drawRect: 方法从未被调用,因为框架未设置为非零大小。添加一个 initWithAnnotation: 方法来解决这个问题。

- (id) initWithAnnotation: (id <MKAnnotation>) annotation reuseIdentifier: (NSString *) reuseIdentifier

    self = [super initWithAnnotation: annotation reuseIdentifier: reuseIdentifier];
    if (self != nil)
    
        self.frame = CGRectMake(0, 0, 30, 30);
        self.opaque = NO;
    
    return self;

【讨论】:

【参考方案2】:

您是否在任何地方为此视图子类调用了 setNeedsDisplay? (就在你让这个视图可见之后是个好地方。)

【讨论】:

视图如何变得可见?在 mapView:viewForAnnotation: 返回后是否可见? 我之所以这么问,是因为我没有看到任何其他注释视图的代码明确地使它们可见。他们没有在任何地方调用 setNeedsDisplay。

以上是关于MKAnnotationView drawRect:没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何为 MKAnnotationView 放置动画?

- (MKAnnotationView *)mapView 没有被调用

定位自定义 MKAnnotationView

MKAnnotationView 和点击检测

MKAnnotationView 自定义标注对辅助功能 (VoiceOver) 不可见

将 TintColor 设置为 MKAnnotationView 图像