Πώς μπορώ να ξέρω πότε setregion σε MKMapView δεν θα βάλει φωτιά regionWillChange / regionDidChange

ψήφοι
4

Δουλεύω σε κάποιο κώδικα iPhone MapKit οποία πυρκαγιές στα ανοικτά κάποια γεγονότα, όταν τα όρια της αλλαγής του χάρτη (κατά βάση κάποια ερωτήματα σε έναν εξωτερικό διακομιστή). Υπάρχει μία περίπτωση άκρη δεν μπορώ να φαίνεται να λύσουν. Όταν οι χρήστες εισάγουν μια νέα διεύθυνση χρησιμοποιώ setRegion να κάνετε ζουμ σε αυτή τη θέση και στη συνέχεια θα υπολογίσει τα όρια του χάρτη και διερευνούν την εξωτερική μου server με αυτές τις συντεταγμένες. Πάντα καλέστε setRegion όμως, υπάρχει μία περίπτωση άκρη όταν δεν θα βάλει φωτιά. Δηλαδή, είναι, όταν ένας χρήστης που συμβαίνει μαγικά για να επιλέξετε την ίδια ακριβώς διεύθυνση που βρίσκεται στο σημερινό κέντρο του χάρτη, όταν ο χάρτης μεγεθύνεται με τον ίδιο ακριβώς περιοχή. Φυσικά, η δυνατότητα αυτή είναι σπάνια, αλλά είναι εύκολο να επιτευχθεί με τον ακόλουθο κώδικα:

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

Αυτό θα είναι το ισοδύναμο της που επιτρέπει στο χρήστη να ρίξει μια καρφίτσα στο κέντρο του τρέχοντος χάρτη και η φωτιά από ένα ερώτημα στον server μου με βάση αυτό. Δυστυχώς, επειδή η λογική κωδικό εξαρτάται από την αλλαγή περιοχής (που έχω κάνει, έτσι ώστε οι χρήστες μπορούν εύκολα να μετακινήσετε γύρω από το χάρτη και δεν χρειάζεται να πατήσετε ρητά ένα κουμπί ανανέωσης), χρειάζομαι ένα έργο γύρω. Πώς μπορώ να ξέρω πότε setRegion έχει κληθεί αλλά δεν θα βάλει φωτιά regionWillChange / regionDidChange. Μπορώ να παρακάμψετε τη λειτουργία κάποιο τρόπο;

EDIT: Όπως σχολίασε σχετικά με την πρώτη απάντηση, προσπάθησα να ανιχνεύσει όταν η περιοχή δεν θα αλλάξει, χρησιμοποιώντας τον ακόλουθο κώδικα:

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

Δυστυχώς, όταν έθεσα το searchLocation να είναι το κέντρο του τρέχοντος χάρτη πάρω τα ακόλουθα αποτελέσματα:

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

Σε διαφορετική περίπτωση το σφάλμα είναι ελαφρώς διαφορετική, αλλά σε γενικές γραμμές, ακόμη και όταν η περιοχή είναι λίγο διαφορετική, όπως αυτή setRegion ή Morever, regionDidChange, δεν φωτιά. Μπορεί κανείς να εξηγήσει για ποιο λόγο; Ή πώς θα μπορούσα να πάω για τον εντοπισμό αυτό σωστά. Σημείωση: Επίσης, προσπάθησα με mapView.centerCoordinate αλλά έχω παρόμοια λάθη, και εγώ το μόνο που θέλουν να ξέρουν πότε η περιοχή δεν θα αλλάξει (αν το centerCoordinate είναι το ίδιο με το επίπεδο ζουμ / περιοχή μπορεί ακόμα να είναι διαφορετική).

Δημοσιεύθηκε 18/01/2010 στις 19:02
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
0

Οι ακόλουθοι κωδικοί λειτουργεί για μένα:

    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")
    }
Απαντήθηκε 18/04/2017 στις 16:41
πηγή χρήστη

ψήφοι
0

Αυτό είναι ένα hacked μέχρι λύση που φαίνεται να λειτουργεί καλά για μένα.

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
}

Όπως έχετε ίσως παρατηρήσει, έχω κάνει την υπόθεση ότι η ακρίβεια μετά τον έκτο δεκαδικό ψηφίο είναι πάρα πολύ ασήμαντο ( έως 11 mm ) για μια οπτική αλλαγή που θα απαιτείται στο χάρτη (ακόμη και στο υψηλότερο επίπεδο ζουμ).

Απαντήθηκε 30/09/2012 στις 12:14
πηγή χρήστη

ψήφοι
0

Γιατί δεν μπορείτε απλά να καλέσετε regionWill / Μήπως αλλάξετε με το χέρι από τον κώδικα που δημιουργεί τη νέα θέση στον χάρτη, εάν εντοπίσει το σημείο που θα ορίσετε το χάρτη για να θα είναι η τρέχουσα κέντρο;

Απαντήθηκε 18/01/2010 στις 21:20
πηγή χρήστη

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