Cum pot schimba poziția de cadru pentru un obicei MKAnnotationView?

voturi
6

Încerc să fac o vedere adnotare personalizată subclasarea MKAnnotationViewși suprascrierea drawRectmetodei. Vreau scopul de a fi trase compensate din poziția adnotărilor, oarecum ca o MKPinAnnotationViewface, astfel încât punctul de PIN - ul este la coordonatele specificate, mai degrabă decât la mijlocul bolțului. Așa că am stabilit poziția și dimensiunea cadrului așa cum se arată mai jos. Cu toate acestea, ea nu arata ca eu pot afecta poziția cadrului , la toate, numai dimensiunea. Imaginea sfârșește prin a fi trasă centrat pe poziția adnotată. Orice sfaturi cu privire la modul de a realiza ceea ce vreau?

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];
}
Întrebat 19/03/2010 la 18:13
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
19

Am încercat folosind centerOffset și pentru anumite motive imaginea a fost în poziția corectă atunci când imaginea este mărită, dar pe măsură ce zoom hartă imaginea va muta departe de unde trebuia să fie. Fix la aceasta era setarea cadrului de imagine cu offset. Iată codul am folosit (Puteți lăsa lucrurile înștiințărilor dacă nu aveți înștiințările), am folosit pinii de aici )

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

Ajustați centerOffset și calloutOffset după cum este necesar pentru a se potrivi cu imaginea, și punctul central dorit, și punctul înștiințărilor.

Publicat 31/05/2010 la 19:23
sursa de către utilizator

voturi
15

Mai degrabă decât subclasă MKAnnotationView, ați încercat , folosind un MKAnnotationView generic și prin setarea imageși centerOffsetproprietățile?

Publicat 19/03/2010 la 20:28
sursa de către utilizator

voturi
2

Dvs. UIAnnotationVieweste întotdeauna tras la aceeași scară, nivelul de zoom hartă nu contează. De aceea , centerOffsetnu este legat cu nivelul de zoom.

annView.centerOffseteste ceea ce ai nevoie. Dacă vedeți că PIN - ul nu este la locul bun (de exemplu, centrul de jos a muta un pic atunci când schimbați nivelul de zoom), este pentru că nu a stabilit dreptul centerOffset.

Apropo, dacă doriți să setați punctul coordonatei la centrul de jos a imaginii, coordonata X a ta centerOffsetar trebui să fie 0.0f, ca centru de annotationView imaginea în mod implicit. Deci , încercați:

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

Raspuns de la [ imagine MKAnnotation decalate imagine particularizată pini

Publicat 09/03/2013 la 17:46
sursa de către utilizator

voturi
-3

Vă mulțumim pentru exemplul BadPirate.

Am încercat folosind UIImageview, dar eu nu cred că este necesar.

Clasa mea arata ca acest lucru

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

    NSString *stitle;
}

Și punerea în aplicare

- (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;
}
Publicat 04/08/2011 la 08:14
sursa de către utilizator

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