Jak mám vědět, kdy setregion na MKMapView nedojde k odpálení regionWillChange / regionDidChange

hlasů
4

Já pracuji na nějakém iPhone MapKit kódem, který vystřelí off některé události, kdy se hranice mapy změní (v podstatě některé dotazy na externím serveru). Tam je jedna hrana případ nemůžu řešit. Pokud uživatelé zadají novou adresu mám použít setRegion přiblížit na tomto místě a potom jsem spočítat hranice mapy a dotazovat můj externí server s těmito souřadnicemi. Vždycky říkám setRegion však existuje jedna hrana případ, kdy nedojde k odpálení. To znamená, že když uživatel magicky stává vybrat přesně stejnou adresu, která leží při současném středu mapy, pokud se mapa, která zvětší na přesně stejné oblasti. Samozřejmě tato možnost je vzácný, ale je snadno dosažitelné pomocí následující kód:

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];

To by bylo ekvivalentem umožňuje uživateli umístit špendlík ve středu aktuální mapy a vypálit dotaz na můj server založený na tom. Bohužel, protože logiku kód závisí na oblasti měnící (což jsem udělal, takže uživatelé mohou snadno se posunovat po mapě a není nutné explicitně stisknout tlačítko refresh), musím vyřešit. Jak mohu vědět, kdy setRegion byl nazýván, ale nedojde k odpálení regionWillChange / regionDidChange. Mohu přepsat funkci, jak někteří?

EDIT: Jak jsem již uvedl v první odpovědi, snažil jsem se zjistit, kdy by region nezmění pomocí následující kód:

//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];

Bohužel, když jsem nastavit searchLocation být centrem současného mapě I získat následující výsledky:

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

V různých případech je chyba mírně liší, ale obecně řečeno, i když je region je mírně odlišná podobné setRegion nebo navíc nesmí regionDidChange, nestřílejte. Může mi někdo vysvětlit, proč? Nebo jak bych mohl jít o zjišťování to správně. Poznámka: Také jsem se snažil s mapView.centerCoordinate ale mám podobné chyby, a já jen chci vědět, kdy bude region NOT změnit (v případě, že centerCoordinate je stejná úroveň zoomu / region může ještě být odlišné).

Položena 18/01/2010 v 19:02
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

Následující kódy pracuje pro mě:

    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")
    }
Odpovězeno 18/04/2017 v 16:41
zdroj uživatelem

hlasů
0

Jedná se naboural do řešení, která se zdá, že funguje dobře pro mě.

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
}

Jak jste si pravděpodobně všimli, jsem učinil předpoklad, že přesnost po šestém desetinné místo je příliš bezvýznamný ( až 11 mm ) pro vizuální změnou má být požadováno na mapě (dokonce i na nejvyšší úrovni zoomu).

Odpovězeno 30/09/2012 v 12:14
zdroj uživatelem

hlasů
0

Proč ne jen zavolat regionWill / Věděli ručně přepnout z kódu, který je nastavení nového místa na mapě, pokud zjistí bod, to by stanovil mapy že by současná centrum?

Odpovězeno 18/01/2010 v 21:20
zdroj uživatelem

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