2010-07-07 10 views
13

jeśli użytkownik pominie widok MKMapView, chcę, aby MKAnnotacje, które są blisko siebie, były automatycznie grupowane w jedną adnotację "grupową". , jeśli użytkownik powiększy, adnotacja "grupa" powinna zostać ponownie podzielona na unikatowe/oryginalne adnotacje.Jak mogę grupować MKAnnotacje automatycznie w odniesieniu do poziomu powiększenia?

jabłko robi to już w iOS 4 Photos.app

jest tam powszechne, „predefiniowanych” sposób to zrobić?

+0

www.BMSClusterMap.com – nurxyz

Odpowiedz

4

To genialny pomysł. Pracuję nad podobną aplikacją, mam nadzieję, że nie masz nic przeciwko, jeśli zaimplementuję tę koncepcję :).

Aby odpowiedzieć na twoje pytanie najlepiej jak potrafię, nie, nie sądzę, aby istniała wcześniej zdefiniowana metoda.

Najlepszym sposobem na zrobienie tego (po obejrzeniu aplikacji do zdjęć iOS4) jest skorzystanie z metody delegatów mapView:regionDidChangeAnimated:. Za każdym razem, gdy użytkownik przewinie/przybliży, ta metoda zostanie wywołana.

Wewnątrz tej metody możesz mieć matematykę z szybką geometrią, aby określić, czy twoje punkty są "wystarczająco blisko", aby rozważyć scalenie. Po ich "scaleniu" usuniesz jedną lub obie adnotacje i umieścisz kolejną adnotację z powrotem w tym samym miejscu, które jest odwołaniem do obu (możesz bardzo łatwo utworzyć klasę AnnotationCluster, która może być zgodna z MKAnnotation, ale także posiadać NSArray adnotacji, a także zawierają metody "wyłamywania" lub "pochłaniania" innych adnotacji i/lub instancji AnnotationCluster itp.).

Kiedy mówię "matematyka szybkiej geometrii", mam na myśli odległość dwóch punktów w stosunku do rozpiętości mapy i uwzględnienie ich względnej odległości jako wartości procentowej zakresu całej mapy.

To byłoby trudne, gdybyś miał setki adnotacji, ponieważ nie potrafię od razu wymyślić dobrego sposobu na wprowadzenie tego bez podwójnej pętli.

Co myślisz?

6

jego normalnej pracy z ponad 1500 adnotacji na mapie:

-(void)mapView:(MKMapView *)mapView_ regionDidChangeAnimated:(BOOL)animated 
{ 
    NSMutableSet * coordSet = [[NSMutableSet alloc] init]; 

    for(id<MKAnnotation> an in mapView_.annotations) 
    { 
     if([an isKindOfClass:[MKUserLocation class]]) 
      continue; 

     CGPoint point = [mapView_ convertCoordinate:an.coordinate toPointToView:nil]; 
     CGPoint roundedPoint; 

     roundedPoint.x = roundf(point.x/10)*10; 
     roundedPoint.y = roundf(point.y/10)*10; 

     NSValue * value = [NSValue valueWithCGPoint:roundedPoint]; 

     MKAnnotationView * av = [mapView_ viewForAnnotation:an]; 

     if([coordSet containsObject:value]) 
     { 
      av.hidden = YES; 
     } 
     else 
     { 
      [coordSet addObject:value]; 
      av.hidden = NO; 
     } 
    } 

    [coordSet release]; 
} 
+0

lubię tego rozwiązania, ale to naprawdę nie jest normalne. To losowo wybiera adnotację i ukrywa inne adnotacje w pobliżu. Próbuję uczynić go bardziej przewidywalnym dzięki konsekwentnemu zachowaniu. – Mazyod

+1

OK, ten wpis ma najlepszą odpowiedź: http://stackoverflow.com/questions/7132207/grouped-ungroup-mkannotation-depending-on-the-zoom-level-and-keep-it-fast – Mazyod

0

Ten project robi coś ciekawego. Zanim jednak zmienisz zbyt wiele elementów w swoim kodzie, zapoznaj się ze zgłoszonymi problemami. Ponieważ może to nie być wystarczająco dobre dla twoich potrzeb.

I PERSONNALY skończyło się realizacji this

Powiązane problemy