Jak změním pozici rámečku pro zvyku MKAnnotationView?

hlasů
6

Snažím se dělat vlastní poznámky zobrazení podle subclassing MKAnnotationViewa přepsáním drawRectmetodu. Chci pohled je třeba vyvodit kompenzovat z polohy anotací je, podobně jako MKPinAnnotationViewto dělá tak, že bod čepu je na zadaných souřadnicích, spíše než střed čepu. Tak jsem se nastavit pozici rámu a velikosti, jak je uvedeno níže. Nicméně, to nevypadá jako já může mít vliv na pozici rámečku vůbec, pouze velikost. Obraz končí vtahování středu nad polohy anotací. Nějaké tipy na to, jak dosáhnout toho, co chci?

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];
}
Položena 19/03/2010 v 18:13
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
19

Snažil jsem se pomocí centerOffset az nějakého důvodu se obraz byl ve správné poloze při přiblížení, ale jak jste přiblížení mapy oddálení obrazu by se vzdálit od místa, kde měl být. Oprava tomu bylo nastavení rám obrazu s offset. Zde je kód jsem použil (můžete vynechat popisku věci, pokud nemáte popisek), který se používá I kolíky ze zde )

#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;
}

Upravte centerOffset a calloutOffset podle potřeby tak, aby vyhovovaly svůj image a požadovaný střed a popisek bod.

Odpovězeno 31/05/2010 v 19:23
zdroj uživatelem

hlasů
15

Spíše než podtřídy MKAnnotationView, už jste zkoušeli obecný MKAnnotationView a nastavení imagea centerOffsetvlastnosti?

Odpovězeno 19/03/2010 v 20:28
zdroj uživatelem

hlasů
2

Váš UIAnnotationViewvždy vypracován ve stejném měřítku, úroveň přiblížení mapy je na tom nezáleží. To je důvod, proč centerOffsetnení vázán s úrovní zoomu.

annView.centerOffsetje to, co budete potřebovat. Pokud zjistíte, že váš pin není na dobré umístění (například dole uprostřed pohybovat trochu při změně úrovně zoomu), je to proto, že jste nenastavili právo centerOffset.

Mimochodem, pokud chcete nastavit bod souřadnic v pravém dolním středu obrazu, souřadnice x váš centerOffsetby měl být 0.0f, jako annotationView středu snímku ve výchozím nastavení. Tak zkuste:

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

Odpověď od [ MKAnnotation obrazu přesazení s vlastními pin image

Odpovězeno 09/03/2013 v 17:46
zdroj uživatelem

hlasů
-3

Díky za příklad BadPirate.

Snažil jsem se pomocí UIImageview, ale I dont myslím, že je to nutné.

Moje třída vypadal

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

    NSString *stitle;
}

A provádění

- (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;
}
Odpovězeno 04/08/2011 v 08:14
zdroj uživatelem

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