iOS MapKit Аннотация, не показывает правильное местоположение - PullRequest
3 голосов
/ 18 сентября 2011

Я использую собственное изображение для моей аннотации mapkit.Но главная проблема, с которой, как мне кажется, я сталкиваюсь при использовании собственного изображения, заключается в том, что при уменьшении масштаба аннотация находится не в правильной точке на карте, и ТОЛЬКО до тех пор, пока я полностью не уменьшу масштаб, будет отображатьсяточка аннотации в правильном месте.Кажется, что когда я использую обычный вывод MKPinAnnotationView , он работает нормально, так как вывод находится в правильном месте, увеличен или уменьшен, заранее спасибо всем, кто может помочь.

Код, который я использовал, выглядит следующим образом:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation
{

NSLog(@"welcome into the map view annotation");

if ([annotation isKindOfClass:[MKUserLocation class]])

return nil;

MKAnnotationView *pprMapNote = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pprMapNote"];


pprMapNote.image = [UIImage imageNamed:[NSString stringWithFormat:@"GPS_note.png"]];

pprMapNote.canShowCallout = YES;
pprMapNote.centerOffset = CGPointMake(-21,-60);
pprMapNote.calloutOffset = CGPointMake(0, 0);
//[pprMapNote addSubview:pprMapNoteImg];

UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
                action:@selector(showDetail)
      forControlEvents:UIControlEventTouchUpInside];
pprMapNote.rightCalloutAccessoryView = rightButton;

//remember to write in conditional for the different icons that should be loaded based on location

UIImageView *pprNoteLocIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"loc_icon_casino.png"]];
pprMapNote.leftCalloutAccessoryView = pprNoteLocIcon;
[pprNoteLocIcon release];

return pprMapNote;

}

Ответы [ 2 ]

8 голосов
/ 19 сентября 2011

Вы устанавливаете centerOffset аннотации.

Обратите внимание, что это смещение не , масштабированное с уровнем масштабирования.Чем дальше вы уменьшаете изображение, тем дальше будет отображаться изображение от координаты.

В значении по умолчанию MKPinAnnotationView значение centerOffset остается по умолчанию равным 0,0, а изображение вывода разработано таким образом, чтобынижняя точка штифта находится на координате.Таким образом, при увеличении масштаба изображение булавки, кажется, увеличивается относительно карты под ним, но нижняя часть булавки все еще указывает на координату.

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


Некоторые другие не связанные элементы:

  • У вас есть утечка памяти дляpprMapNote alloc + init (добавить авто-релиз)
  • Вы должны использовать dequeueReusableAnnotationViewWithIdentifier, чтобы разрешить повторное использование представления аннотации.
  • Вместо использования addTarget для вызова собственногометод для нажатия кнопки выноски, гораздо лучше использовать собственный метод делегата представления карты calloutAccessoryControlTapped

См. этот ответ для примера вышеупомянутых трех пунктов.

3 голосов
/ 08 сентября 2015

Пин-код рисуется в отдельном виде, поэтому он не будет масштабироваться в зависимости от состояния вашего вида.

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

  aView.image = [UIImage imageNamed ... ];
  aView.centerOffset = CGPointMake(0,-aView.frame.size.height*0.5);
...