重用自定义绘制的注释视图

时间:2012-02-25 10:23:50

标签: iphone ios mapkit mkannotation mkannotationview

我设法在自定义彩色圆圈注释中绘制数字(基于this)。我想对我的自定义注释类进行一些优化,然后我阅读了有关重用的内容。 我的问题是,如果我将这些东西重复使用,注释视图会在地图上混合,这是一个很大的问题。 自定义绘制的注释视图无法重用?或者它是否与视图的注释有关?我的意思是,注释存储要在其视图上绘制的数字,实际上它是注释与其视图之间的1to1关系。

这是我的相关代码: 自定义annotationview的init:

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

    self = [super initWithAnnotation: annotation reuseIdentifier: reuseIdentifier];
    if (self != nil)
    {
       if ([annotation isKindOfClass:[CircleMarker class]]) 
       {
           // custom annotation class with some extra fields
           CircleMarker * clm = (CircleMarker * )annotation;
           self.locationMarker = clm; 

           //  ... setting frame and other stuff

           self.image = [self getImage];  /* this method DRAWS image based on clm */
           self.canShowCallout = NO;           
       }
...
}

代表:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
    static NSString *reuseId_small = @"smallcircle"; 
    static NSString *reuseId_big   = @"bigcircle";   
    CircleAnnotationView * nca = nil;    
    if ((int)[self.mapView getZoomLevel] < ZOOM_LEVEL_FOR_NUMBERS)
        {
        nca = (CircleAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:reuseId_small];   
        if (nca == nil )
            nca = [[[CircleAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId_small imageType:2] autorelease];
        }
        else 
        {
        nca = (CircleAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:reuseId_big];  
        if ( nca == nil )
            nca = [[[CircleAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId_big imageType:1] autorelease];
        }
 return nca;
}

我尝试用自定义self.image =函数替换drawRect部分,但结果是一样的。

感谢。

1 个答案:

答案 0 :(得分:2)

当MKAnnotationView出列时,会调用prepareForReuse。在此方法中,您可以检查内容是否需要重新绘制。

https://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKAnnotationView_Class/Reference/Reference.html

我在CircleAnnotationView代码中看到了这个