Повторное использование пользовательских нарисованных аннотаций - PullRequest
2 голосов
/ 25 февраля 2012

Мне удалось нарисовать числа внутри пользовательских цветных аннотаций (основанных на это ).Я хочу сделать некоторые оптимизации для своего пользовательского класса аннотаций, и я прочитал о повторном использовании.Моя проблема в том, что если я сделаю материал повторно используемым, аннотации будут смешаны на карте, что является большой проблемой.Пользовательские нарисованные аннотации нельзя использовать повторно?Или это как-то связано с аннотацией представления?Я имею в виду, что в аннотации хранится число, которое нужно нарисовать на его виде, практически это отношение 1 к 1 между аннотацией и ее видом.

Вот мой соответствующий код: 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 Ответ

2 голосов
/ 01 марта 2012

В MKAnnotationView вызывается метод prepareForReuse, когда он отключается.В этом методе вы можете проверить, нужно ли перерисовывать содержимое.

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

Я вижу, что это происходит внутри вашего кода CircleAnnotationView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...