Ζητούνται: Πώς να αξιόπιστα, επιλέξτε συνέπεια ένα σχολιασμό MKMapView

ψήφοι
29

Μετά την κλήση MKMapView «s setCenterCoordinate: κινουμένων σχεδίων: η μέθοδος (χωρίς κινούμενα σχέδια), θα ήθελα να καλέσω selectAnnotation: κινουμένων σχεδίων: (με κινούμενα σχέδια), έτσι ώστε το σχολιασμό σκάει έξω από το νέο επίκεντρο πινέζα.

Προς το παρόν, απλά προσέξτε για mapViewDidFinishLoadingMap: και, στη συνέχεια, επιλέξτε το σχολιασμό. Ωστόσο, αυτό είναι προβληματικό. Για παράδειγμα, η μέθοδος αυτή δεν καλείται, όταν δεν υπάρχει καμία ανάγκη να φορτώσει πρόσθετα δεδομένα χάρτη. Σε αυτές τις περιπτώσεις, το σχολιασμό μου δεν είναι επιλεγμένο.:(

Πολύ καλά. Θα μπορούσαμε να ονομάσουμε αυτό αμέσως μετά τη ρύθμιση το κέντρο συντεταγμένων αντ 'αυτού. Ααα, αλλά σε αυτή την περίπτωση είναι πιθανό ότι υπάρχει είναι τα δεδομένα χάρτη για να φορτώσει (αλλά δεν έχει ολοκληρωθεί η φόρτωση ακόμα). Θα κινδυνεύουν καλώντας πάρα πολύ σύντομα, με το animation γίνει περιστασιακές στην καλύτερη περίπτωση.

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

Οποιεσδήποτε ιδέες για το πώς θα επιτευχθεί αυτό, ή πώς να με άλλο τρόπο (αξιόπιστα), επιλέξτε έναν σχολιασμό μετά την εκ νέου κεντράρισμα την προβολή χάρτη για τις συντεταγμένες όπου που ζει σχολιασμό;

Ενδείξεις εκτιμηθεί - χάρη!

Δημοσιεύθηκε 10/08/2009 στις 20:53
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
36

Έτρεξα στο ίδιο πρόβλημα, αλλά δεν βρήκε αυτό που φαίνεται σαν μια αξιόπιστη και λογική λύση:

  1. Εφαρμογή της μεθόδου εκπρόσωπος MapView: didAddAnnotationViews :. Όταν προσπάθησα να επιλέξετε τον σχολιασμό απευθείας μέσα από τη μέθοδο εκπρόσωπος, η επεξήγηση έπεσε με το pin! Αυτό φάνηκε περίεργο, έτσι μπορώ να προσθέσω μια μικρή καθυστέρηση μισού δευτερολέπτου.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Επιλέξτε το αρχικό σχόλιο, όπως θα περιμένατε, αλλά καλώντας selectAnnotation: κινουμένων σχεδίων?

    -(void)selectInitialAnnotation {
        [self.mapView selectAnnotation:self.initialAnnotation animated:YES];
    }
    

Φαίνεται ότι selectAnnotation:animated:δεν τίθεται υπό ορισμένες συνθήκες. Συγκρίνετε με MKMapView έγγραφα :

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

Απαντήθηκε 16/02/2010 στις 01:06
πηγή χρήστη

ψήφοι
7

Μια πιο συνεπή τρόπο από ό, τι χρησιμοποιώντας ένα σταθερό χρονικό όριο για να ακούσετε την regionDidChangeεπανάκλησης. Ρυθμίστε το κέντρο συντεταγμένων του χάρτη στην επιθυμητή σχολιασμό, και όταν η μέθοδος regionDidChange ονομάζεται, στη συνέχεια, επιλέξτε το σχολιασμό στο κέντρο, για να ανοίξετε το μήνυμα.

Εδώ είναι ένα μικρό βίντεο πήρα από το πράγμα τρέχει τυχαία ποσοστό μεταξύ 5 καρφίτσες.

Πρώτον, goto το κέντρο συντεταγμένων του σχολιασμού. Ας πούμε ότι το αντικείμενο σχολιασμού είναι το όνομά του thePin.

- (void)someMethod {
    [map setCenterCoordinate:thePin.coordinate animated:YES];
}

Στη συνέχεια, στη regionDidChangeμέθοδο, επιλέξτε αυτό το σχόλιο.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Απαντήθηκε 12/11/2010 στις 06:23
πηγή χρήστη

ψήφοι
4

Λοιπόν απλά FYI, αυτό είναι αυτό που λένε οι docs,

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

Έτσι, αν θέλετε να καλέσετε setCenterCoordinate:animated:ή setRegion:animated:και, στη συνέχεια, θέλω να επιλέξετε τον σχολιασμό καλώντας, selectAnnotation:animated:ο σχολιασμός δεν θα πάρει επιλεγεί και η επεξήγηση δεν θα εμφανιστεί beacause το ίδιο ακριβώς λόγο που αναφέρεται παραπάνω στο docs, λοιπόν ο τρόπος που θα μεγάλη για να έχουν κάτι σαν, setCenterCoordinate:animated:ComletionBlockαλλά δεν είναι εκεί ..! Ο τρόπος που λειτούργησε για μένα είναι όπως παρακάτω,

 [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.mapView setCenterCoordinate:location.coordinate animated:YES];
    } completion:^(BOOL finished) {
        [self.mapView selectAnnotation:location animated:YES];
    }];

Αυτό θα σας δώσει ένα μπλοκ ολοκλήρωση και u μπορεί να χρησιμοποιήσει αυτό για να επιλέξετε το σχολιασμό.

Απαντήθηκε 14/08/2013 στις 06:43
πηγή χρήστη

ψήφοι
4

Αυτό που έχει δουλέψει για μένα ζητούσε selectAnnotation:animated:από την mapView:didAddAnnotationViews:μέθοδο:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
    [mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}

Τεκμηρίωση της Apple για το ίδιο εδώ .

Σημειώστε ότι είχα μόνο μια σημείωση στο χάρτη, έτσι [[mapView annotations] lastObject]ήταν μια χαρά για τους σκοπούς μου. Απόσταση σε μίλια σας μπορεί να διαφέρουν.

Απαντήθηκε 02/11/2009 στις 19:44
πηγή χρήστη

ψήφοι
2

Είχα ένα παρόμοιο πρόβλημα. Ήμουν χρησιμοποιώντας την προεπιλεγμένη MKPinAnnotationView με animatesDrop: ΝΑΙ. Μετά έβαλα τα σχόλια στο MKMapView, έκανα το εξής:

[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]

η οποία με τη λογική του προγράμματος μου, θα πρέπει να επιλέξετε το πλησιέστερο σχολιασμό. Αυτό δεν λειτουργούσε. Κατάλαβα το λόγο: η άποψη σχολιασμός δεν ήταν στην οθόνη κατά τη στιγμή της επιλογής κλήσης, λόγω της κίνησης καρφίτσα πτώση. Έτσι, το μόνο που έκανα ήταν ορίσετε ένα χρονοδιακόπτη για να επιλέξετε τον σχολιασμό ένα δευτερόλεπτο αργότερα. Είναι ένα hack, αλλά λειτουργεί. Δεν είμαι σίγουρος αν αυτό θα λειτουργήσει σε κάθε περίπτωση όμως, για παράδειγμα, σε ένα 3G εναντίον 3Gs. Θα ήθελα να είναι καλύτερο να καταλάβω το δικαίωμα λειτουργία επανάκλησης για να το θέσω σε.

selectTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
               selector:@selector(selectClosestAnnotation) userInfo:nil
               repeats:NO];

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Απαντήθηκε 15/12/2009 στις 18:49
πηγή χρήστη

ψήφοι
1

Έχω βρεθεί αρκετά προβλήματα με όλες τις λύσεις που είδα για το πρόβλημά μου (που θέλω να επιλέξετε ένα σχολιασμό όταν το προστέθηκαν από viewDidAppear):

  1. Χρησιμοποιώντας τη mapView:didAddAnnotationViews:μέθοδο πληρεξούσιο.

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

  2. Χρησιμοποιώντας τη mapViewDidFinishLoadingMap:μέθοδο πληρεξούσιο.

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

Λύση:

John Μπλάκμπερν ήταν πολύ κοντά, αλλά χωρίς τη mapView:didAddAnnotationViews:μέθοδο. Απλά καλέστε τη δική μου selectAnnotation:μέθοδο, πριν προσθέσετε το σχολιασμό, με καθυστέρηση:

[self.mapView addAnnotation:ann];
[self performSelector:@selector(selectAnnotation:) withObject:ann afterDelay:0.5];

Και αυτό είναι αυτό που κάνω στο μου selectAnnotation:μέθοδο:

- (void)selectAnnotation:(id < MKAnnotation >)annotation
{
   [self.mapView selectAnnotation:annotation animated:YES];
}

Δοκιμάστηκε σε δύο iPhone 3GS (iOS 5 και 6) και ένα iPhone 5.

Απαντήθηκε 23/10/2012 στις 09:31
πηγή χρήστη

ψήφοι
0

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

Εδώ είναι αυτό που βρήκα για να εργαστούν. Ίσως αυτό θα λειτουργήσει για σας επίσης: Πώς να ενεργοποιήσει την άποψη επεξήγηση MKAnnotationView χωρίς επαφή με το pin;

Απαντήθηκε 24/08/2009 στις 03:53
πηγή χρήστη

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