настраиваемая выноска аннотации карты - как контролировать ширину - PullRequest
2 голосов
/ 27 мая 2011

Я успешно реализовал код вызова пользовательской аннотации карты из асинхронной публикации в блоге .(Когда пользователь нажимает на значок булавки карты, я показываю настроенное изображение вместо стандартного представления выноски).

Единственная оставшаяся проблема заключается в том, что выноска занимает всю ширину представления, и приложение будет выглядеть намного лучшеесли ширина соответствует изображению, которое я использую.

screen shot

У меня есть подкласс MKAnnotationView, и когда я устанавливаю его contentWidth равным ширине изображения, треугольник не всегдавернитесь к булавке, иначе изображение даже не будет отображаться в обёртке. Images are wrong

Любая помощь или предложения будут полезны.Спасибо.

1 Ответ

1 голос
/ 13 июля 2012

Я столкнулся с подобной проблемой при реализации CalloutMapAnnotationView для iPad.По сути, я не хотел, чтобы версия для iPad занимала всю ширину mapView.

В методе prepareFrameSize установите свою ширину:

- (void)prepareFrameSize {
    // ...
    // changing frame x/y origins here does nothing
    frame.size = CGSizeMake(320.0f, height);
    self.frame = frame;
}

Далее вам придется рассчитатьxOffset, основанный на parentAnnotationView:

- (void)prepareOffset {
    // Base x calculations from center of parent view
    CGPoint parentOrigin = [self.mapView convertPoint:self.parentAnnotationView.center 
                                             fromView:self.parentAnnotationView.superview];
    CGFloat xOffset =   0;
    CGFloat mapWidth = self.mapView.bounds.size.width;
    CGFloat halfWidth = mapWidth / 2;
    CGFloat x = parentOrigin.x + (320.0f / 2);

    if( parentOrigin.x < halfWidth && x < 0 ) // left half of map
        xOffset = -x;
    else if( parentOrigin.x > halfWidth && x > mapWidth ) // right half of map
        xOffset = -( x - mapWidth);
    // yOffset calculation ...
}

Теперь за drawRect:(CGRect)rect до того, как будет нарисован пузырь выноски:

- (void)drawRect:(CGRect)rect {
    // ...
    // Calculate the carat lcation in the frame
    if( self.centerOffset.x == 0.0f )
        parentX = 320.0f / 2;
    else if( self.centerOffset.x < 0.0f )
        parentX = (320.0f / 2) + -self.centerOffset.x;
    //...
}

Надеюсь, это поможет вам встать на правильный путь.

...