2010-08-30 11 views
10

Ho implementato un'annotazione personalizzata derivata da MKAnnotation denominata ContainerAnnotation e una vista di annotazione personalizzata derivata da MKAnnotationView con un drawRect: metodo denominato ContainerAnnotationView. Per qualche ragione drawRect: il metodo non viene chiamato e non riesco a capire perché.MKAnnotationView drawRect: non viene chiamato

Ecco il codice sorgente per la mia vista di annotazione.

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 

Dal mio punto di vista del controller:

- (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... 
} 

ho altre annotazioni che utilizzano un v anilla MKAnnotation con un'immagine che funziona bene. Ho anche un'altra vista annotazione personalizzata che non implementa drawRect: funziona perfettamente. Qualche idea su cosa sto facendo male qui?

risposta

22

Il problema si è verificato che il mio drawRect: il metodo non è mai stato chiamato perché il frame non era impostato su una dimensione diversa da zero. Aggiunta di initWithAnnot: il metodo per risolvere questo problema.

- (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

Hai chiamato setNeedsDisplay per questa sottoclasse di visualizzazione ovunque? (Subito dopo aver reso visibile questa vista è un buon posto.)

+0

Come la vista diventa visibile? È reso visibile dopo mapView: viewForAnnotation: restituisce? –

+0

Chiedo perché non vedo alcun codice per le altre viste di annotazione che li rendono esplicitamente visibili. In nessun posto chiamano setNeedsDisplay. –

+0

Questo è tutto ciò di cui avevo bisogno per farlo funzionare. – VaporwareWolf