UPDATE
Похоже, эта проблема была тихо исправлена в iOS 4.3. До этого момента расстояние, которое считалось "достаточно большим" для аннотации, подлежащей рециркуляции, казалось, было сотнями миль, даже когда оно приближалось очень близко. Когда я создаю свое приложение с помощью iOS 4.3 SDK, аннотации перерабатываются на основе более разумных ограничений.
Кто-нибудь еще сталкивается с этой проблемой? Здесь код:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(WWMapAnnotation *)annotation {
// Only return an Annotation view for the placemarks. Ignore for the current location--the iPhone SDK will place a blue ball there.
NSLog(@"Request for annotation view");
if ([annotation isKindOfClass:[WWMapAnnotation class]]){
MKPinAnnotationView *browse_map_annot_view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"BrowseMapAnnot"];
if (!browse_map_annot_view) {
browse_map_annot_view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"BrowseMapAnnot"] autorelease];
NSLog(@"Creating new annotation view");
} else {
NSLog(@"Recycling annotation view");
browse_map_annot_view.annotation = annotation;
}
...
Как только отображается представление, я получаю
2009-08-05 13:12:03.332 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
и снова и снова, для каждой аннотации (~ 60) я добавил. Карта (правильно) отображает только две аннотации в текущем прямоугольнике. Я устанавливаю область в viewDidLoad:
if (center_point.latitude == 0) {
center_point.latitude = 35.785098;
center_point.longitude = -78.669899;
}
if (map_span.latitudeDelta == 0) {
map_span.latitudeDelta = .001;
map_span.longitudeDelta = .001;
}
map_region.center = center_point;
map_region.span = map_span;
NSLog(@"Setting initial map center and region");
[browse_map_view setRegion:map_region animated:NO];
Запись журнала для заданного региона печатается на консоль до того, как будут запрошены какие-либо аннотации.
Проблема заключается в том, что, поскольку все аннотации запрашиваются сразу, [mapView dequeueReusableAnnotationViewWithIdentifier] ничего не делает, поскольку для каждой аннотации на карте есть уникальные MKAnnotationViews. Это приводит к проблемам памяти для меня.
Одна из возможных проблем заключается в том, что эти аннотации группируются в довольно маленьком пространстве (радиус ~ 1 миля). Несмотря на то, что карта сильно масштабируется в viewDidLoad (широта и долгота delta.001), она по-прежнему загружает все аннотации сразу.
Спасибо...