Nasıl bir MKMapView üzerinde setregion regionWillChange / regionDidChange kovmayacak zaman anlarım

oy
4

Bazı olayları ateşler bazı iPhone MapKit kodu üzerinde çalışıyorum zaman haritası değişim sınırları (harici bir sunucuya temelde bazı sorgular). Ben çözmek gibi olamaz bir kenar durum vardır. Kullanıcıların yeni bir adres girdiğinizde ben bu konumda yakınlaştırmak için setRegion kullanmak ve daha sonra ben haritanın sınırları hesaplamak ve bu koordinatları ile Harici sunucusunu sorgulamak. Hep Ancak setRegion diyoruz o kovmayacak bir kenar davası var. Yani, bir kullanıcı sihirli o harita aynı bölgeye büyültüldüğünde haritanın geçerli merkezi yatan tam aynı adres seçmek için gerçekleştiğinde. Tabii bu olasılık nadirdir ancak aşağıdaki kodla ulaşılabilir kolaydır:

CLLocation *centerOfMap = [[CLLocation alloc] initWithLatitude:mapView.centerCoordinate.latitude longitude:mapView.centerCoordinate.longitude];
mySearchLocation.searchLocation = centerOfMap;

//Recenter and zoom map in on search location
MKCoordinateRegion region =  {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center = mySearchLocation.searchLocation.coordinate;region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
[self.mapView setRegion:region animated:YES];

Bu, geçerli haritanın ortasında için bir raptiye ve buna dayanarak benim sunucusuna bir sorgu ateşlemesi için kullanıcı izin eşdeğer olacaktır. kod mantığı (kullanıcıların kolayca harita etrafında kaydırmak ve açıkça bir yenileme düğmesine basın olamaz ki yaptığım) değiştirerek bölgeye bağlıdır Maalesef, çünkü ben etrafında bir iş demektir. Nasıl setRegion denilen edildiğinde bilebilirim ama regionWillChange / regionDidChange patlamaz. Ben işlevi bazı nasıl geçersiz kılabilir miyim?

DÜZENLEME: ilk yanıt yorumladı, ben bölge Aşağıdaki kodu kullanarak değiştirmek olmaz algılamak çalıştı:

//Recenter and zoom map in on search location
MKCoordinateRegion region =  {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center = mySearchLocation.searchLocation.coordinate;
region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
region = [mapView regionThatFits:region]; //Not sure if this is necessary

NSLog(@diff in latitude of center %f, (mapView.region.center.latitude - region.center.latitude));
NSLog(@diff in longitude of center %f, (mapView.region.center.longitude - region.center.longitude));
NSLog(@diff in latitude span %f, (mapView.region.span.latitudeDelta - region.span.latitudeDelta));
NSLog(@diff in longitude span %f, (mapView.region.span.longitudeDelta - region.span.longitudeDelta));

[self.mapView setRegion:region animated:YES];

Ben searchLocation ayarladığınızda Ne yazık ki şu sonuçlar elde geçerli haritanın merkezi olması:

diff in latitude of center 0.000000
diff in longitude of center 0.000016
diff in latitude span -0.000000
diff in longitude span 0.000000

Farklı durumlarda hata biraz farklı ama genel olarak bölge bu setRegion veya Morever, regionDidChange, ateş etme gibi biraz farklı olduğunda bile konuşuyor. Herkes neden açıklayabilir misiniz? Ya da düzgün bu algılama hakkında gidebiliriz. Not: Ben de mapView.centerCoordinate ile denedim ama benzer hatalar olsun, ben tek bölge DEĞİŞTİREMEYECEĞİNİZİ ne zaman (centerCoordinate aynı ise yakınlaştırma düzeyi / bölge hala farklı olabilir) bilmek istiyorum.

Oluştur 18/01/2010 saat 19:02
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Aşağıdaki kodları benim için çalışıyor:

    let predictRect = mapView.convertRegion(mapView.regionThatFits(THE_REGION_YOU_WANT_TO_SET), toRectTo: mapView)

    if predictRect.origin.x.rounded() == 0 && predictRect.origin.y.rounded() == 0
        && predictRect.size.width.rounded() == mapView.bounds.width
        && predictRect.size.height.rounded() == mapView.bounds.height
    {
        debugPrint("setRegion same, will not trigger region change event")
    }
Cevap 18/04/2017 saat 16:41
kaynak kullanıcı

oy
0

Bu benim için iyi iş gibi görünüyor bir yukarı kesmek çözümdür.

MKCoordinateRegion currentRegion = mapView.region;

// Capture the instances where setRegion will not be fired
BOOL regionLatitudeSame = (int)(currentRegion.center.latitude*1000000) == (int)(region.center.latitude*1000000);
BOOL regionLongitudeSame = (int)(currentRegion.center.longitude*1000000) == (int)(region.center.longitude*1000000);
BOOL regionSame = regionLatitudeSame && regionLongitudeSame;
if (regionSame)
{
    // Safe to assume that regionWillChange/regionDidChange WON'T be called
}

Muhtemelen fark ettik, ben altıncı ondalık yeri doğruluk (çok önemsiz olduğunu varsaydık ettik 11 mm'ye kadar (hatta en yüksek yakınlaştırma düzeyinde) harita üzerinde gerekli olan görsel bir değişiklik için).

Cevap 30/09/2012 saat 12:14
kaynak kullanıcı

oy
0

Neden sadece o anki merkez olacağını haritayı ayarlarsınız noktayı tespit ederse regionWill / yeni harita konumu kuruyor kodundan manuel değiştirdi mi aramıyorsun?

Cevap 18/01/2010 saat 21:20
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more