2010-06-10 10 views
10

Kayıtlı bir temsilci ile bir MKMapView sahibiyim, bu nedenle bölge değişikliği olaylarını (özellikle, regionDidChangeAnimated) için dinleyebilirim. Bir bölge değişikliği olayının, haritayı sürükleyen bir kullanıcının sonucu veya programlı bir setRegion: isteğinden kaynaklanıp kaynaklanmadığını söylemenin sağlam bir yolunu arıyorum.MKMapView'da regionChange olayının MKMapView'ın programlı veya kullanıcı sürüklemesi olduğunu nasıl anlarım?

Amacım, haritayı elle kapatamadıkça, otomatik merkezlemenin hangi noktada kapanmayacağını belirlediyse, haritayı bir konum izlemesine göre otomatik merkezleyen bir uygulamaya sahip olmaktır. Bu yüzden, setRegion'u arıyorum: harita görünümünü uygun şekilde yeniden girmek için, ancak sonuçta ortaya çıkan regionDidChangeAnimated: çağrısının programlı mı yoksa bir kullanıcı panosundan mı olduğunu söylemeye zorlanıyorum. Birlikte bir şeyler hacklemeyi denedim, ancak kullanıcı bir yer güncellemesi geldiğinde kaydırma yapmaya başladığında yarış koşullarına koşuyorum.

cevap

5

Bu sorunu, kodun tetiklediği bölge/merkez değişikliklerini takip eden bir boolean ile çözdüm. En zarif çözüm değil, ama bir çekicilik gibi çalışır. UIMcView UIScrollView türetmek utanç verici değil.

init:

regionChangeFromCode = FALSE; 

düğmesi eylemi:

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

seti merkezi:

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

ve harita temsilci:

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

Buna ek olarak, konumu güncelleyen ve setCenter'ı çağıran bir güncelleme döngüsüm var. Düğme seçildiğinde harita merkezi izler, aksi takdirde merkez yalnız kalır.

+0

Bu sorun da vardı. Kodun güzel bir çözüm. Bu biraz hacky, ama o kadar da kötü değil çünkü hala iyi bir ingilizce okur. Bu sadece bir boolean bayrağı :) – chakrit

İlgili konular