Πώς μπορώ να αλλάξω τη θέση του πλαισίου για μια προσαρμοσμένη MKAnnotationView;

ψήφοι
6

Προσπαθώ να κάνω μια προσαρμοσμένη προβολή σχολιασμό από υποκλάσεις MKAnnotationViewκαι επιτακτικούς τη drawRectμέθοδο. Θέλω η άποψη να συντάσσεται μετατόπιση από τη θέση του σχολιασμού, όπως κάπως MKPinAnnotationViewτο κάνει, έτσι ώστε το σημείο του πείρου είναι στις καθορισμένες συντεταγμένες, και όχι στη μέση του πείρου. Γι 'αυτό ρυθμίσετε τη θέση και το μέγεθος του πλαισίου, όπως φαίνεται παρακάτω. Ωστόσο, αυτό δεν φαίνεται σαν να μπορεί να επηρεάσει τη θέση του πλαισίου καθόλου, μόνο το μέγεθος. Η εικόνα καταλήγει στο στάδιο της επεξεργασίας στο κέντρο πάνω από τη θέση σχολιασμό. Κάθε συμβουλές για το πώς μπορεί να επιτευχθεί αυτό που θέλω;

MyAnnotationView.h:

@interface MyAnnotationView : MKAnnotationView {

}

MyAnnotationView.m:

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        self.canShowCallout = YES;
        self.backgroundColor = [UIColor clearColor];
        // Position the frame so that the bottom of it touches the annotation position 
        self.frame = CGRectMake(0, -16, 32, 32);
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    [[UIImage imageNamed:@blue-dot.png] drawInRect:rect];
}
Δημοσιεύθηκε 19/03/2010 στις 18:13
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
19

Προσπάθησα χρησιμοποιώντας centerOffset και για κάποιο λόγο η εικόνα ήταν στη σωστή θέση όταν μεγεθύνεται, αλλά όπως μπορείτε να μεγεθύνεται το χάρτη από την εικόνα θα κινηθεί μακριά από εκεί που έπρεπε να είναι. Η λύση σε αυτό ήταν τον καθορισμό του πλαισίου της εικόνας με την offset. Εδώ είναι ο κώδικας που χρησιμοποιείται (Μπορείτε να αφήσετε την ουσία επεξήγησης, αν δεν έχετε μια επεξήγηση), χρησιμοποίησα τις καρφίτσες από εδώ )

#pragma mark MKMapViewDelegate
- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if(![annotation isKindOfClass:[MyAnnotation class]]) // Don't mess user location
        return nil;

    MKAnnotationView *annotationView = [aMapView dequeueReusableAnnotationViewWithIdentifier:@"spot"];
    if(!annotationView)
    {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"spot"];
        annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [(UIButton *)annotationView.rightCalloutAccessoryView addTarget:self action:@selector(openSpot:) forControlEvents:UIControlEventTouchUpInside];
        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;
        annotationView.centerOffset = CGPointMake(7,-15);
        annotationView.calloutOffset = CGPointMake(-8,0);
    }

    // Setup annotation view
    annotationView.image = [UIImage imageNamed:@"pinYellow.png"]; // Or whatever

    return annotationView;
}

Ρυθμίστε centerOffset και calloutOffset όπως απαιτείται για να ταιριάζει με την εικόνα σας, και επιθυμητό σημείο κέντρο και σημείο επεξήγησης.

Απαντήθηκε 31/05/2010 στις 19:23
πηγή χρήστη

ψήφοι
15

Αντί υποκατηγορία MKAnnotationView, έχετε δοκιμάσει χρησιμοποιώντας ένα γενικό MKAnnotationView και τον καθορισμό των imageκαι centerOffsetιδιότητες;

Απαντήθηκε 19/03/2010 στις 20:28
πηγή χρήστη

ψήφοι
2

Σας UIAnnotationViewσχεδιάζεται πάντα στο ίδιο επίπεδο, το επίπεδο ζουμ του χάρτη δεν έχει σημασία. Αυτός είναι ο λόγος για τον οποίο centerOffsetδεν δεσμεύεται με το επίπεδο ζουμ.

annView.centerOffsetείναι ό, τι χρειάζεστε. Αν δείτε ότι το PIN σας δεν είναι σε καλή θέση (για παράδειγμα, το κάτω μέρος κέντρο κινηθεί λίγο όταν αλλάζετε το επίπεδο ζουμ), είναι επειδή δεν έχετε ορίσει το σωστό centerOffset.

Με την ευκαιρία, αν θέλετε να ορίσετε το σημείο των συντεταγμένων στο κέντρο του κάτω μέρους της εικόνας, την x συντεταγμένη σας centerOffsetθα πρέπει να είναι 0.0f, ως κέντρο annotationView την εικόνα από προεπιλογή. Έτσι, δοκιμάστε:

annView.centerOffset = CGPointMake(0, -imageHeight / 2);

Απάντηση από [ MKAnnotation εικόνα αντισταθμιστεί με το έθιμο καρφίτσα εικόνα

Απαντήθηκε 09/03/2013 στις 17:46
πηγή χρήστη

ψήφοι
-3

Ευχαριστώ για παράδειγμα BadPirate.

Προσπάθησα χρησιμοποιώντας UIImageview, αλλά δεν σκέφτομαι ότι είναι απαραίτητο.

Η τάξη μου έμοιαζε με αυτό

@interface ImageAnnotationView : MKAnnotationView {
    UIImageView *_imageView;
    id m_parent;
    BusinessMapAnnotation *m_annotation;

    NSString *stitle;
}

Και η εφαρμογή

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    self.frame = CGRectMake(0, 0, kWidth, kHeight);
    self.backgroundColor = [UIColor clearColor];

    self.m_annotation = (BusinessMapAnnotation*)annotation;

    NSString* categoryTitle = m_annotation.sCTitle;

    NSString* l_titleString =  @"NearPin.png";

    if (categoryTitle!= nil ) {
        if ([categoryTitle length] > 0) {
            //NSLog(@"%@", categoryTitle);
            l_titleString = [NSString stringWithFormat:@"Map%@.png", categoryTitle];
            //NSLog(@"%@", l_titleString);
        }
    }

    self.stitle = m_annotation.sTitle;

    _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:([stitle isEqualToString:@"You are here"]) ? @"Pushpin_large.png":l_titleString]];
    _imageView.contentMode = UIViewContentModeCenter;

    _imageView.frame = CGRectMake(kBorder, kBorder, kWidth, kHeight);

    [self addSubview:_imageView];
    _imageView.center = ([stitle isEqualToString:@"You are here"]) ? CGPointMake(15.0, -10.0):CGPointMake(kWidth/2, 0.0);

    return self;
}
Απαντήθηκε 04/08/2011 στις 08:14
πηγή χρήστη

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