Είναι δυνατόν να κινηθεί η συντεταγμένη ενός MKAnnotation χωρίς την προσθήκη και την αφαίρεση του σχολιασμού από τον χάρτη;
Πώς να μετακινήσετε μια MKAnnotation χωρίς την προσθήκη / αφαιρέσετε από τον χάρτη;
Βρήκα μια πολύ απλή μέθοδο. Ήθελα να ενημερώσει την θέση του παίκτη μου ομαλά χωρίς να αφαιρέσετε και στη συνέχεια εκ νέου προσθήκη του σχολιασμού παίκτη. Αυτό λειτουργεί καλά για προ-iOS4 εφαρμογές, και αυτό που κάνει είναι τόσο μετακινήσετε το pin και το κέντρο του χάρτη σε νέα θέση του πείρου:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
[UIView commitAnimations];
Εδώ είναι το ίδιο πράγμα, αλλά χρησιμοποιώντας τη συνιστώμενη λειτουργία μπλοκ για iOS4:
[UIView animateWithDuration:0.5 animations:^{
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];
Είναι πράγματι δυνατό χωρίς την αφαίρεση και την προσθήκη του σχολιασμού εκτός φυσικά.
Θα πρέπει να παρατηρήσουμε MKAnnotation σας συντονίσει και να ενημερώσετε τη θέση του MKAnnotationView όταν αλλάζει. Εναλλακτικά, μπορείτε (και αυτό είναι ίσως το πιο κομψό τρόπο για να γίνει αυτό) αντλούν τη δική σας MKAnnotation και MKAnnotationView και να τους «κινητή».
Βλέπε Μετακίνηση-MKAnnotationView για μια λεπτομερή παράδειγμα το οποίο ζωντανεύει επίσης τη θέση του σχολιασμού.
Υποκατηγορία MKPointAnnotation και έχει τη δυνατότητα να ενημερώσετε την προβολή σχολιασμού στο χάρτη για τη νέα συντονίσει αυτόματα.
Απλά χρησιμοποιήστε κνθ:
[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];
Αν MKAnnotation σας έχει μια μέθοδο setCoordinate, περιλαμβάνουν μόνο αυτές τις γραμμές ακριβώς εκεί:
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
[self willChangeValueForKey:@"coordinate"];
coordinate = newCoordinate;
[self didChangeValueForKey:@"coordinate"];
}
Δεν ξέρω αν είναι γενικότερα δυνατό, αλλά είναι, αν έχετε τη δική σας προσαρμοσμένη MKAnnotationView.
Ήμουν σε θέση να προσαρμόζει την προσέγγιση τεκμηριωμένη σε http://spitzkoff.com/craig/?p=108 από Craig Spitzkoff:
- Δώστε προσωπικό σας MKAnnotationView αναφορά στο αντικείμενο MKAnnotation σας
- Προσθέστε μια μέθοδο updateCoordinates με το αντικείμενο MKAnnotation και να το ονομάσουμε όταν θέλετε να αλλάξετε τη θέση του σχολιασμού
- Καλέστε regionChanged για το έθιμο MKAnnotationView να το αφήσει να ξέρετε πότε να επανατοποθετηθεί (π.χ. όταν MKAnnotation έχει ενημερώσει συντεταγμένες)
- Στην drawRect στην εσωτερική αντικειμένου άποψη ανήκει στην προσαρμοσμένη σας MKAnnotationView μπορείτε να αλλάξετε τη θέση χρησιμοποιώντας τις συντεταγμένες του MKAnnotation (κρατάτε μια αναφορά σε αυτό).
Θα μπορούσατε πιθανόν απλοποιήσει αυτήν την προσέγγιση περαιτέρω - δεν μπορεί να απαιτήσει ένα εσωτερικό αντικείμενο προβολή σε όλες τις περιστάσεις.
Μετά την ενημέρωση των συντεταγμένων ή κάποιες άλλες ιδιότητες του σχολιασμού, απλά καλέστε ακόλουθη μέθοδο MKMapViewDelegate να αναδιατυπώσει σχολιασμό σας:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
π.χ:
myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
Οι περισσότερες απαντήσεις που βασίζεται στο γεγονός ότι Σχολιασμός σας έχει γίνει μέσω MKPlacemark επέκταση. Αλλά τι γίνεται με οποιοδήποτε άλλο αντικείμενο (π.χ. προσαρμοσμένη εικόνα για δείκτη) που υλοποιεί μόνο το πρωτόκολλο MKAnnotation; Δεν θα έχουν την μέθοδο setCoordinate. Έτσι, εδώ είναι η απάντηση βασίζεται σε κώδικα, που παρέχεται από 100grams
MKAnnotationView *av = [self.mapView viewForAnnotation:user];
//user is an object which implements <MKAnnotation>
// You will probably get your MKAnnotationView in your own way
if (av){
// here user returns CLLocationCoordinate2D coordinate
MKMapPoint mapPoint = MKMapPointForCoordinate([user getLastLocation]);
// converting mapPoint to CGPoint
CGPoint newPos;
CGFloat zoomFactor = self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
newPos.x = mapPoint.x/zoomFactor;
newPos.y = mapPoint.y/zoomFactor;
// animation for annotation's move
static NSString *POSITION_KEY=@"positionAnimation";
static NSString *PATH_ANIMATION_KEY=@"position";
if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:PATH_ANIMATION_KEY];
animation.fromValue = [NSValue valueWithCGPoint:av.center];
animation.toValue = [NSValue valueWithCGPoint:newPos];
animation.duration = 0.3;
animation.delegate = av;
animation.fillMode = kCAFillModeForwards;
[av.layer addAnimation:animation forKey:POSITION_KEY];
}
// moving view
av.center = newPos;
οπότε Μπορείτε βασικά πρέπει να πάρετε την αντίστοιχη MKAnnotationView που θα μπορούσε να επιτευχθεί και με επανάληψη μέσω όλων των σχολιασμών και είναι νέα θέση. Έκανα μια θήκη σειρά για όλα αυτά (NSMutableArray * mapAnnotaions) έτσι και τώρα θα μπορούσα να επαναλάβει ακριβώς όπως:
for (id annotation in mapAnnotaions) {call refresh method here for id}
Εάν έχετε κρατήσει μια αναφορά στο σχολιασμό σας, κάνετε μια αλλαγή στην ιδιοκτησία συντεταγμένων, στη συνέχεια, προσθέστε το σχόλιο στο χάρτη και πάλι, η τοποθεσία της άποψης σχολιασμό θα ενημερώσει. Δεν χρειάζεται να αφαιρέσετε το σχολιασμό (που θα προκαλέσει η προβολή σχολιασμού να εξαφανιστεί στιγμιαία). Αυτό δεν θα σας δώσει ένα ωραίο μετάβασης, όταν ο σχολιασμός συντονίζει ενημερώνεται όμως. Επίσης, δεν οδηγεί σε απώλεια μνήμης, ούτε υπάρχουν πολλαπλά από το ίδιο σχόλιο προστίθεται στο χάρτη (αν δει κανείς τον αριθμό των σχολιασμών στο MapView, παραμένει σταθερή κατά την εκ νέου προσθέσετε το σχόλιο).
Σε Swift 4.0 και IOS 11.0, εγώ απλά προσθέστε δυναμικό χαρακτηριστικό στην συντονίσει ιδιοκτησία της τάξης του παιδιού της MKAnnotation κατηγορίας και λειτουργεί: Όλες οι σχολιασμοί για MapView ενημερώσει τη θέση τους εάν συντονίζουν αξία των MKAnnotation αντικείμενα ενημέρωση:
class CarAnnotation: NSObject, MKAnnotation {
@objc dynamic var coordinate: CLLocationCoordinate2D
//Add your custom code here
}
Ρίξτε μια ματιά στο μου MapKitDragAndDrop δείγμα, σας επιτρέπει να ενημερώσετε MKAnnotation και να προχωρήσουμε MKAnnotationView τόσο το iPhone OS 3 και iOS 4 (θα χρησιμοποιεί ενσωματωμένη σύροντας υποστήριξη).
Δεν φαίνεται δυνατό να αλλάξει η συντεταγμένη ενός αντικειμένου MKAnnotation και στη συνέχεια να ενημερώσει το MKMapView της αλλαγής.
Ωστόσο, αφαιρώντας το προηγούμενο σχολιασμό από τον χάρτη, αλλάζοντας τις συντεταγμένες του αντικειμένου σχολιασμό σας και προσθέτοντας πίσω στο χάρτη λειτουργεί καλά.
[theMapView removeAnnotation:myAnnotation];
[myAnnotation setLatitude:newLatitude];
[theMapView addAnnotation:myAnnotation];
Γιατί δεν θέλετε να το κάνετε με αυτόν τον τρόπο;













