Jak zmienić położenie ramki dla zwyczaju MKAnnotationView?

głosy
6

Próbuję wykonać niestandardowy widok adnotacji przez instacji MKAnnotationViewi przesłanianie drawRectmetody. Chcę pogląd, jakie należy wyciągnąć z przesunięcia pozycji adnotacją za, trochę jak MKPinAnnotationViewrobi to tak, że punkt kołka jest w określonych współrzędnych, a nie na środku sworznia. Tak ustawić pozycję i rozmiar ramki, jak pokazano poniżej. Jednak to nie wygląda jak mogę wpływać na pozycję ramki w ogóle, tylko rozmiar. Obraz kończy się wyciągnąć centralnie nad pozycję adnotacji. Wszelkie wskazówki, jak osiągnąć to, co chcę?

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];
}
Utwórz 19/03/2010 o 18:13
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
19

Próbowałem za pomocą centerOffset iz jakiegoś powodu obraz znajdował się w prawidłowej pozycji, gdy powiększony, ale jak powiększony mapę z obrazem ruszy od miejsca, gdzie miało to być. Poprawka do tego było ustawienie ramki obrazu z przesunięciem. Oto kod użyłem (Można pominąć rzeczy objaśnienia, jeśli nie masz objaśnienie), użyłem szpilki od tutaj )

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

Dostosować centerOffset i calloutOffset ile potrzeba, aby dopasować swój wizerunek oraz żądany punkt środkowy i punkt objaśnienia.

Odpowiedział 31/05/2010 o 19:23
źródło użytkownik

głosy
15

Zamiast podklasy MKAnnotationView, czy próbowałeś za pomocą rodzajowe MKAnnotationView i ustawiania imagei centerOffsetwłaściwości?

Odpowiedział 19/03/2010 o 20:28
źródło użytkownik

głosy
2

Twój UIAnnotationViewjest zawsze rysowane w tej samej skali, stopień powiększenia mapie nie ma znaczenia. Dlatego centerOffsetnie jest związana z poziomem powiększenia.

annView.centerOffsetjest to, czego potrzebujesz. Jeśli widzisz, że Twój kod PIN nie jest w dobrej lokalizacji (na przykład w dolnej środkowej przesunąć trochę po zmianie poziomu powiększenia), to dlatego, że nie określiła prawo centerOffset.

Przy okazji, jeśli chcesz ustawić punkt współrzędnych w dolnej środkowej części obrazu, współrzędna x swój centerOffsetpowinno być 0.0f, jako centrum annotationView obraz domyślnie. Więc spróbuj :

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

Odpowiedź [ MKAnnotation obrazu z przesunięciem obrazu zwyczaj pin

Odpowiedział 09/03/2013 o 17:46
źródło użytkownik

głosy
-3

Dzięki za przykład BadPirate.

Próbowałem przy użyciu UIImageView, ale nie sądzę, że jest to konieczne.

Moja klasa to wyglądało

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

    NSString *stitle;
}

I realizacja

- (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;
}
Odpowiedział 04/08/2011 o 08:14
źródło użytkownik

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