Как изменить положение рамки для пользовательского 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 и по какой - то причине образ находился в правильном положении при увеличении, но , как вы увеличенной карту из изображения будет перемещаться от места , где он должен был быть. Исправление этого была установка кадра изображения со смещением. Вот код , который я использовал (Вы можете оставить выноски вещи , если у вас нет выноски), я использовал штыри из здесь )

#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это то , что вам нужно. Если вы видите , что ваш контактный не в хорошем месте (например, нижний центр немного смещается при изменении масштаба), это потому , что вы не установили право centerOffset.

Кстати, если вы хотите , чтобы установить точку начала координат в центре нижней части изображения, координаты х ваш 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