Πώς να μετακινήσετε μια MKAnnotation χωρίς την προσθήκη / αφαιρέσετε από τον χάρτη;

ψήφοι
31

Είναι δυνατόν να κινηθεί η συντεταγμένη ενός MKAnnotation χωρίς την προσθήκη και την αφαίρεση του σχολιασμού από τον χάρτη;

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


11 απαντήσεις

ψήφοι
16

Βρήκα μια πολύ απλή μέθοδο. Ήθελα να ενημερώσει την θέση του παίκτη μου ομαλά χωρίς να αφαιρέσετε και στη συνέχεια εκ νέου προσθήκη του σχολιασμού παίκτη. Αυτό λειτουργεί καλά για προ-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];
}];
Απαντήθηκε 05/07/2010 στις 14:47
πηγή χρήστη

ψήφοι
6

Είναι πράγματι δυνατό χωρίς την αφαίρεση και την προσθήκη του σχολιασμού εκτός φυσικά.

Θα πρέπει να παρατηρήσουμε MKAnnotation σας συντονίσει και να ενημερώσετε τη θέση του MKAnnotationView όταν αλλάζει. Εναλλακτικά, μπορείτε (και αυτό είναι ίσως το πιο κομψό τρόπο για να γίνει αυτό) αντλούν τη δική σας MKAnnotation και MKAnnotationView και να τους «κινητή».

Βλέπε Μετακίνηση-MKAnnotationView για μια λεπτομερή παράδειγμα το οποίο ζωντανεύει επίσης τη θέση του σχολιασμού.

Απαντήθηκε 14/03/2011 στις 16:19
πηγή χρήστη

ψήφοι
4

Υποκατηγορία MKPointAnnotation και έχει τη δυνατότητα να ενημερώσετε την προβολή σχολιασμού στο χάρτη για τη νέα συντονίσει αυτόματα.

Απαντήθηκε 26/04/2014 στις 20:17
πηγή χρήστη

ψήφοι
4

Απλά χρησιμοποιήστε κνθ:

[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];

Αν MKAnnotation σας έχει μια μέθοδο setCoordinate, περιλαμβάνουν μόνο αυτές τις γραμμές ακριβώς εκεί:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    [self willChangeValueForKey:@"coordinate"];
    coordinate = newCoordinate;
    [self didChangeValueForKey:@"coordinate"];
}
Απαντήθηκε 13/03/2012 στις 19:30
πηγή χρήστη

ψήφοι
2

Δεν ξέρω αν είναι γενικότερα δυνατό, αλλά είναι, αν έχετε τη δική σας προσαρμοσμένη MKAnnotationView.

Ήμουν σε θέση να προσαρμόζει την προσέγγιση τεκμηριωμένη σε http://spitzkoff.com/craig/?p=108 από Craig Spitzkoff:

  1. Δώστε προσωπικό σας MKAnnotationView αναφορά στο αντικείμενο MKAnnotation σας
  2. Προσθέστε μια μέθοδο updateCoordinates με το αντικείμενο MKAnnotation και να το ονομάσουμε όταν θέλετε να αλλάξετε τη θέση του σχολιασμού
  3. Καλέστε regionChanged για το έθιμο MKAnnotationView να το αφήσει να ξέρετε πότε να επανατοποθετηθεί (π.χ. όταν MKAnnotation έχει ενημερώσει συντεταγμένες)
  4. Στην drawRect στην εσωτερική αντικειμένου άποψη ανήκει στην προσαρμοσμένη σας MKAnnotationView μπορείτε να αλλάξετε τη θέση χρησιμοποιώντας τις συντεταγμένες του MKAnnotation (κρατάτε μια αναφορά σε αυτό).

Θα μπορούσατε πιθανόν απλοποιήσει αυτήν την προσέγγιση περαιτέρω - δεν μπορεί να απαιτήσει ένα εσωτερικό αντικείμενο προβολή σε όλες τις περιστάσεις.

Απαντήθηκε 15/02/2010 στις 04:45
πηγή χρήστη

ψήφοι
1

Μετά την ενημέρωση των συντεταγμένων ή κάποιες άλλες ιδιότητες του σχολιασμού, απλά καλέστε ακόλουθη μέθοδο MKMapViewDelegate να αναδιατυπώσει σχολιασμό σας:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

π.χ:

myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
Απαντήθηκε 04/07/2014 στις 00:51
πηγή χρήστη

ψήφοι
1

Οι περισσότερες απαντήσεις που βασίζεται στο γεγονός ότι Σχολιασμός σας έχει γίνει μέσω 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}
Απαντήθηκε 18/07/2012 στις 17:31
πηγή χρήστη

ψήφοι
1

Εάν έχετε κρατήσει μια αναφορά στο σχολιασμό σας, κάνετε μια αλλαγή στην ιδιοκτησία συντεταγμένων, στη συνέχεια, προσθέστε το σχόλιο στο χάρτη και πάλι, η τοποθεσία της άποψης σχολιασμό θα ενημερώσει. Δεν χρειάζεται να αφαιρέσετε το σχολιασμό (που θα προκαλέσει η προβολή σχολιασμού να εξαφανιστεί στιγμιαία). Αυτό δεν θα σας δώσει ένα ωραίο μετάβασης, όταν ο σχολιασμός συντονίζει ενημερώνεται όμως. Επίσης, δεν οδηγεί σε απώλεια μνήμης, ούτε υπάρχουν πολλαπλά από το ίδιο σχόλιο προστίθεται στο χάρτη (αν δει κανείς τον αριθμό των σχολιασμών στο MapView, παραμένει σταθερή κατά την εκ νέου προσθέσετε το σχόλιο).

Απαντήθηκε 16/02/2011 στις 14:58
πηγή χρήστη

ψήφοι
0

Σε Swift 4.0 και IOS 11.0, εγώ απλά προσθέστε δυναμικό χαρακτηριστικό στην συντονίσει ιδιοκτησία της τάξης του παιδιού της MKAnnotation κατηγορίας και λειτουργεί: Όλες οι σχολιασμοί για MapView ενημερώσει τη θέση τους εάν συντονίζουν αξία των MKAnnotation αντικείμενα ενημέρωση:

class CarAnnotation: NSObject, MKAnnotation {
    @objc dynamic var coordinate: CLLocationCoordinate2D
    //Add your custom code here
}
Απαντήθηκε 15/03/2018 στις 09:30
πηγή χρήστη

ψήφοι
0

Ρίξτε μια ματιά στο μου MapKitDragAndDrop δείγμα, σας επιτρέπει να ενημερώσετε MKAnnotation και να προχωρήσουμε MKAnnotationView τόσο το iPhone OS 3 και iOS 4 (θα χρησιμοποιεί ενσωματωμένη σύροντας υποστήριξη).

Απαντήθηκε 30/06/2010 στις 23:41
πηγή χρήστη

ψήφοι
-5

Δεν φαίνεται δυνατό να αλλάξει η συντεταγμένη ενός αντικειμένου MKAnnotation και στη συνέχεια να ενημερώσει το MKMapView της αλλαγής.

Ωστόσο, αφαιρώντας το προηγούμενο σχολιασμό από τον χάρτη, αλλάζοντας τις συντεταγμένες του αντικειμένου σχολιασμό σας και προσθέτοντας πίσω στο χάρτη λειτουργεί καλά.

[theMapView removeAnnotation:myAnnotation]; 
[myAnnotation setLatitude:newLatitude];
[theMapView addAnnotation:myAnnotation];

Γιατί δεν θέλετε να το κάνετε με αυτόν τον τρόπο;

Απαντήθηκε 13/02/2010 στις 12:53
πηγή χρήστη

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