A: 

Did you call setNeedsDisplay for this view subclass anywhere? (Just after you make this view visible is a good place.)

hotpaw2
How does the view become visible? Is it made visible after mapView:viewForAnnotation: returns?
David Potter
I ask because I don't see any code for the other annotation views that explicitly make them visible. Nowhere do they call setNeedsDisplay.
David Potter
+1  A: 

The problem turned out to be that my drawRect: method was never being called because the frame was not set to a non-zero size. Adding an initWithAnnotation: method to do this solved the problem.

- (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;
}
David Potter