Honnan tudom, hogy mikor setregion egy MKMapView nem villan regionWillChange / regionDidChange

szavazat
4

Dolgozom néhány iPhone MapKit kódot, amelyet kilőtt néhány esemény, amikor a határokat a térképen változás (alapvetően néhány lekérdezést egy külső szerver). Van egy éle esetben nem tudok úgy tűnik, hogy megoldja. Amikor a felhasználó belép egy új címet használok setRegion hogy a nagyítás a helyeken, és utána én kiszámítja a határait a térképet, és lekérdezni a külső szerver a koordináták. Mindig hívja setRegion azonban van egy éle esetben, ha ez nem villan. Ez, az, amikor a felhasználó varázslatosan történik, hogy kiválassza pontosan ugyanazt a címet, hogy fekszik a folyó a térkép közepén, amikor a térkép kisléptékű, hogy pontosan ugyanabban a régióban. Természetesen ez a lehetőség a ritka, de ez könnyen megvalósítható a következő 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];

Ez lenne egyenértékű, amely lehetővé teszi a felhasználó számára, hogy egy gombostűt középpontjában a jelenlegi térkép és a tűz ki a lekérdezést saját szerver alapuló. Sajnos, mivel a kód logikai függ a régió változó (amit megtettem annak érdekében, hogy a felhasználók könnyen mozgathatja a térképet, és nem kell nyomnunk egy frissítés gombot), kell a mű körül. Hogyan lehet tudni, hogy mikor setRegion nevezték, de ez nem fog villanni regionWillChange / regionDidChange. Felülírhatom a funkció bizonyos hogyan?

EDIT: Mint megjegyezte, az első válasz, megpróbáltam kimutatni, amikor a régióban nem változnak a következő kódot:

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

Sajnos, amikor én meg a searchLocation, hogy a központ a jelenlegi térkép kapok a következő eredménnyel:

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

Ettől eltérő esetben a hiba némileg eltérő, de általában elmondható akkor is, ha a régió kicsit más, mint ez setRegion vagy Morever, regionDidChange, nem tűz. Tud valaki magyarázni, hogy miért? Vagy hogyan tudnék menni a kimutatására ezt megfelelően. Megjegyzés: Én is próbáltam mapView.centerCoordinate de kapok hasonló hibákat, és csak azt akarom tudni, hogy mikor a régió nem fog változni (ha a centerCoordinate ugyanaz a nagyítási szinten / régió is eltérhet).

A kérdést 18/01/2010 19:02
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

A következő kódokat nekem működik:

    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")
    }
Válaszolt 18/04/2017 16:41
a forrás felhasználó

szavazat
0

Ez egy feltört fel megoldás, amely úgy tűnik, hogy jól működik nekem.

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
}

Ahogy már bizonyára észrevette, Megtettem a feltételezést, hogy a pontosság, miután a hatodik tizedesjegyig túlságosan jelentéktelen ( akár 11 mm ) a vizuális változás szükséges a térképen (akár a legmagasabb nagyítási szinten).

Válaszolt 30/09/2012 12:14
a forrás felhasználó

szavazat
0

Miért nem hívod regionWill / Esetleg változtatni manuálisan, hogy a kód beállítása az új térkép helyét, ha azt érzékeli, hogy a lényeg ez meg a térképen, hogy lenne a jelenlegi központ?

Válaszolt 18/01/2010 21:20
a forrás felhasználó

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