2010-06-10 6 views
10

Ich habe eine MKMapView mit einem registrierten Delegierten so kann ich (insbesondere regionDidChangeAnimated) für Region Änderungsereignisse hören. Ich bin auf der Suche nach einer robusten Art und Weise zu sagen, wenn ein Region Änderungsereignis das Ergebnis eines Benutzers war die Karte oder von einer programatic setRegion: Anfrage ziehen.Wie kann ich feststellen, wenn regionChange Ereignis auf MKMapView programatic oder user-drag von MKMapView?

Mein Ziel ist es, eine App zu haben, die die Karte basierend auf einer Standortverfolgung automatisch zentriert, es sei denn, der Benutzer hat die Karte von Hand verschoben. An diesem Punkt wird die automatische Zentrierung deaktiviert. So, ich rufe setRegion: die Kartenansicht als angemessen rieren, aber ich habe eine harte Zeit zu sagen, wenn der resultierenden regionDidChangeAnimated: Aufruf an den Delegierten programatic ist oder von einer Benutzer-Pfanne. Ich habe versucht, etwas zusammen zu hacken, aber ich laufe immer in Rennen Bedingungen, wenn der Benutzer gerade schwenkt, wenn ein Standort-Update kommt.

Antwort

5

Ich behob dieses Problem mit einem booleschen, die Code-ausgelöste Region/Zentrum Änderungen verfolgt. Nicht die eleganteste Lösung, aber es funktioniert wie ein Zauber. Es ist schade, dass UIMapView nicht von UIScrollView abgeleitet ist.

init:

regionChangeFromCode = FALSE; 

Button-Aktion:

-(IBAction) butCenterPressed:(id)sender 
{ 
    butCenter.selected = !butCenter.selected;  
    if(butCenter.selected) 
     [self setCenter]; 
} 

Set Zentrum:

-(void) setCenter 
{ 
    regionChangeFromCode = TRUE; //before setCenterCoordinate, otherwise this is FALSE in regionWillChangeAnimated 
    [theMap setCenterCoordinate:[self calcCenter]]; //this could also be [theMap setRegion]. Works the same 
} 

und die Karte Delegierten:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    if(!regionChangeFromCode) //so a user did it 
    { 
     if(butCenter.selected) 
      butCenter.selected = FALSE; 
    } 
    regionChangeFromCode = FALSE; 
} 

Zusätzlich dazu habe ich eine Update-Schleife, die die Position aktualisiert und ruft setCenter. Wenn die Schaltfläche ausgewählt ist, folgt die Kartenmitte, ansonsten wird die Mitte in Ruhe gelassen.

+0

auch dieses Problem hat. Dein Code ist eine nette Lösung. Es ist ein bisschen hacky, aber nicht so schlecht, da es immer noch so gut Englisch liest. Es ist nur eine boolesche Flagge :) – chakrit