Как я меняю положение кадра для пользовательского MKAnnotationView?

Я пытаюсь сделать пользовательское представление аннотации путем разделения на подклассы 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];
}
6
задан Matthias Bauch 10 March 2015 в 07:23
поделиться

2 ответа

Вместо подкласса MKAnnotationView вы пробовали использовать общий MKAnnotationView и установить свойства image и centerOffset?

15
ответ дан 8 December 2019 в 02:45
поделиться

Я пробовал использовать centerOffset, и по какой-то причине изображение было в правильном положении при увеличении, но когда вы увеличивали масштаб карты, изображение сдвигалось с того места, где оно должно было быть. Исправлением этого была установка рамки изображения со смещением. Вот код, который я использовал (вы можете опустить выноски, если у вас нет выноски), я использовал контакты из здесь )

#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, чтобы они соответствовали вашему изображению, и желаемая центральная точка, и точка выноски.

19
ответ дан 8 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: