Πώς να προσαρμόσετε το συννεφάκι επεξήγησης για MKAnnotationView;

ψήφοι
87

Είμαι σήμερα εργάζονται με το mapkit και είμαι κολλημένος.

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

Η ιδέα μου ήταν να παρακάμψετε selectAnnotation / deselectAnnotation κατά τη γνώμη μου MKMapViewDelegate, και στη συνέχεια να σχεδιάσετε το δικό μου προσαρμοσμένη προβολή κάνοντας μια κλήση για να μου άποψη έθιμο σχολιασμό. Αυτό λειτουργεί, αλλά μόνο όταν canShowCalloutέχει οριστεί να YESτο έθιμο τάξη άποψή σχολιασμό μου. Αυτές οι μέθοδοι δεν ζήτησε αν έχω αυτό το σύνολο να NO(το οποίο είναι αυτό που θέλω, έτσι ώστε η φούσκα προεπιλογή επεξήγηση δεν έχει εκδοθεί). Γι 'αυτό και δεν έχουν καμία δυνατότητα να γνωρίζει αν ο χρήστης αγγίξει το σημείο μου στο χάρτη (που επιλέγεται) ή έστω ένα σημείο που δεν αποτελεί μέρος των απόψεων σχολιασμό μου (διαγραφείσα) χωρίς να χρειάζεται την προεπιλεγμένη επεξήγηση άποψη φούσκα εμφανίζονται.

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

Οποιεσδήποτε προτάσεις? Είμαι λείπει κάτι προφανές;

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


9 απαντήσεις

ψήφοι
53

Υπάρχει μια ακόμα πιο εύκολη λύση.

Δημιουργήστε μια προσαρμοσμένη UIView(για την επεξήγηση σας).

Στη συνέχεια, δημιουργήστε μια υποκατηγορία της MKAnnotationViewκαι παράκαμψης setSelectedως εξής:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
    {
        //Add your custom view to self...
    }
    else
    {
        //Remove your custom view...
    }
}

Boom, δουλειά που έχει γίνει.

Απαντήθηκε 05/08/2011 στις 12:16
πηγή χρήστη

ψήφοι
40

detailCalloutAccessoryView

Στις παλιές ημέρες αυτό ήταν ένας πόνος, αλλά η Apple έχει λυθεί, απλά ελέγξτε τα έγγραφα για MKAnnotationView

view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.detailCalloutAccessoryView = UIImageView(image: UIImage(named: "zebra"))

Πραγματικά, αυτό είναι όλο. Λαμβάνει κάθε UIView.

Απαντήθηκε 23/07/2012 στις 13:44
πηγή χρήστη

ψήφοι
13

Συνεχίζοντας από @ εξαιρετικά απλή απάντηση TappCandy, εάν θέλετε να εμψυχώσει φούσκα σας με τον ίδιο τρόπο όπως το προεπιλεγμένο, έχω παράγεται αυτή τη μέθοδο κινουμένων σχεδίων:

- (void)animateIn
{   
    float myBubbleWidth = 247;
    float myBubbleHeight = 59;

    calloutView.frame = CGRectMake(-myBubbleWidth*0.005+8, -myBubbleHeight*0.01-2, myBubbleWidth*0.01, myBubbleHeight*0.01);
    [self addSubview:calloutView];

    [UIView animateWithDuration:0.12 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^(void) {
        calloutView.frame = CGRectMake(-myBubbleWidth*0.55+8, -myBubbleHeight*1.1-2, myBubbleWidth*1.1, myBubbleHeight*1.1);
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.1 animations:^(void) {
            calloutView.frame = CGRectMake(-myBubbleWidth*0.475+8, -myBubbleHeight*0.95-2, myBubbleWidth*0.95, myBubbleHeight*0.95);
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.075 animations:^(void) {
                calloutView.frame = CGRectMake(-round(myBubbleWidth/2-8), -myBubbleHeight-2, myBubbleWidth, myBubbleHeight);
            }];
        }];
    }];
}

Φαίνεται αρκετά περίπλοκη, αλλά εφ 'όσον το σημείο φυσαλίδας επεξήγηση σας έχει σχεδιαστεί για να είναι το κέντρο-κάτω, θα πρέπει απλώς να είναι σε θέση να αντικαταστήσει myBubbleWidthκαι myBubbleHeightμε το δικό σας μέγεθος για να λειτουργήσει. Και να θυμάστε για να βεβαιωθείτε ότι subviews σας έχουν τους autoResizeMaskιδιότητα οριστεί σε 63 (δηλαδή «όλοι»), έτσι ώστε να αναβαθμίσουν σωστά στο animation.

: -Joe

Απαντήθηκε 24/10/2011 στις 13:41
πηγή χρήστη

ψήφοι
8

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

Σε σας MKAnnotationViewυποκατηγορία, μπορείτε να χρησιμοποιήσετε

- (void)didAddSubview:(UIView *)subview{
    int image = 0;
    int labelcount = 0;
    if ([[[subview class] description] isEqualToString:@"UICalloutView"]) {
        for (UIView *subsubView in subview.subviews) {
            if ([subsubView class] == [UIImageView class]) {
                UIImageView *imageView = ((UIImageView *)subsubView);
                switch (image) {
                    case 0:
                        [imageView setImage:[UIImage imageNamed:@"map_left"]];
                        break;
                    case 1:
                        [imageView setImage:[UIImage imageNamed:@"map_right"]];
                        break;
                    case 3:
                        [imageView setImage:[UIImage imageNamed:@"map_arrow"]];
                        break;
                    default:
                        [imageView setImage:[UIImage imageNamed:@"map_mid"]];
                        break;
                }
                image++;
            }else if ([subsubView class] == [UILabel class]) {
                UILabel *labelView = ((UILabel *)subsubView);
                switch (labelcount) {
                    case 0:
                        labelView.textColor = [UIColor blackColor];
                        break;
                    case 1:
                        labelView.textColor = [UIColor lightGrayColor];
                        break;

                    default:
                        break;
                }
                labelView.shadowOffset = CGSizeMake(0, 0);
                [labelView sizeToFit];
                labelcount++;
            }
        }
    }
}

Και αν το subviewείναι UICalloutView, τότε μπορείτε να βίδα γύρω με αυτό, και τι είναι μέσα σε αυτό.

Απαντήθηκε 31/08/2011 στις 21:36
πηγή χρήστη

ψήφοι
6

Είχα το ίδιο πρόβλημα. Υπάρχει μια σοβαρή θέσεις blog σχετικά με αυτό το θέμα σε αυτό το blog http://spitzkoff.com/craig/?p=81 .

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

Αυτό που καταλήξαμε να κάνουμε είναι να δημιουργήσετε το δικό μου CustomCalloutViewότι είμαι έχοντας στην κορυφή του μου MKMapView. Μπορείτε να το στυλ την άποψη αυτή με οποιοδήποτε τρόπο θέλετε.

Μου CustomCalloutViewέχει μια μέθοδο παρόμοια με αυτή:


- (void) openForAnnotation: (id)anAnnotation
{
    self.annotation = anAnnotation;
    // remove from view
    [self removeFromSuperview];

    titleLabel.text = self.annotation.title;

    [self updateSubviews];
    [self updateSpeechBubble];

    [self.mapView addSubview: self];
}

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

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

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

Απαντήθηκε 16/10/2009 στις 11:35
πηγή χρήστη

ψήφοι
5

Βασικά για να λύσει αυτό, κάποιος πρέπει να: α) Αποτροπή της φούσκας προεπιλογή επεξήγηση από το να ανεβαίνει. β) Το σχήμα που σχολιασμό έγινε κλικ.

Ήμουν σε θέση να επιτύχουν τους στόχους αυτούς με: α) τον καθορισμό canShowCallout να ΚΑΜΙΑ υποκλάσεις β), MKPinAnnotationView και την ακύρωση των μεθόδων touchesBegan και touchesEnd.

Σημείωση: Θα πρέπει να χειριστεί τα γεγονότα αφής για την MKAnnotationView και όχι MKMapView

Απαντήθηκε 20/11/2009 στις 12:22
πηγή χρήστη

ψήφοι
3

Απλά έρχονται με μια προσέγγιση, η ιδέα εδώ είναι

  // Detect the touch point of the AnnotationView ( i mean the red or green pin )
  // Based on that draw a UIView and add it to subview.
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    CGPoint newPoint = [self.mapView convertCoordinate:selectedCoordinate toPointToView:self.view];
//    NSLog(@"regionWillChangeAnimated newPoint %f,%f",newPoint.x,newPoint.y);
    [testview  setCenter:CGPointMake(newPoint.x+5,newPoint.y-((testview.frame.size.height/2)+35))];
    [testview setHidden:YES];
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    CGPoint newPoint = [self.mapView convertCoordinate:selectedCoordinate toPointToView:self.view];
//    NSLog(@"regionDidChangeAnimated newPoint %f,%f",newPoint.x,newPoint.y);
    [testview  setCenter:CGPointMake(newPoint.x,newPoint.y-((testview.frame.size.height/2)+35))];
    [testview setHidden:NO];
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{  
    NSLog(@"Select");
    showCallout = YES;
    CGPoint point = [self.mapView convertPoint:view.frame.origin fromView:view.superview];
    [testview setHidden:NO];
    [testview  setCenter:CGPointMake(point.x+5,point.y-(testview.frame.size.height/2))];
    selectedCoordinate = view.annotation.coordinate;
    [self animateIn];
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 
{
    NSLog(@"deSelect");
    if(!showCallout)
    {
        [testview setHidden:YES];
    }
}

Εδώ - testview είναι ένα UIViewμέγεθος 320x100 - showCallout είναι BOOL - [self animateIn];είναι η λειτουργία που κάνει προβολή κινουμένων σχεδίων όπως UIAlertView.

Απαντήθηκε 26/01/2012 στις 12:08
πηγή χρήστη

ψήφοι
1

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

https://github.com/u10int/calloutview

Απαντήθηκε 18/10/2012 στις 00:04
πηγή χρήστη

ψήφοι
1

Μπορείτε να χρησιμοποιήσετε leftCalloutView, ρύθμιση annotation.text με @»"

Παρακάτω μπορείτε να δείτε το παράδειγμα κώδικα:

pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
if(pinView == nil){
    pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];       
}
CGSize sizeText = [annotation.title sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:12] constrainedToSize:CGSizeMake(150, CGRectGetHeight(pinView.frame))                                 lineBreakMode:UILineBreakModeTailTruncation];
pinView.canShowCallout = YES;    
UILabel *lblTitolo = [[UILabel alloc] initWithFrame:CGRectMake(2,2,150,sizeText.height)];
lblTitolo.text = [NSString stringWithString:ann.title];
lblTitolo.font = [UIFont fontWithName:@"HelveticaNeue" size:12];
lblTitolo.lineBreakMode = UILineBreakModeTailTruncation;
lblTitolo.numberOfLines = 0;
pinView.leftCalloutAccessoryView = lblTitolo;
[lblTitolo release];
annotation.title = @" ";            
Απαντήθηκε 14/04/2011 στις 10:18
πηγή χρήστη

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