iPhone Mapkit, добавляющий пользовательское изображение и значки в аннотации - PullRequest
3 голосов
/ 02 января 2011

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

Я скачал образец кода с этого сайта:

http://icodeblog.com/2009/12/21/introduction-to-mapkit-in-iphone-os-3-0/

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

Мой проект имеет 4 вкладки, и MapView находится на одной из вкладок. Когда я выбираю его, он анализирует строку JSON и добавляет отдельные аннотации на карту. Когда я нажимаю на булавку, у меня появляются заголовок и субтитры, но я не могу изменить цвет или изображение.

Вот как я добавляю свои аннотации - MapAnnotation следует за MKAnnotation:

MapAnnotation *ann = [[MapAnnotation alloc] initWithCoordinate:newCoord];
    ann.title = [locationDictionary objectForKey:@"name"];
    ann.subtitle = [locationDictionary objectForKey:@"name"];

    [mapView addAnnotation:ann];
    [ann release]

Вот как я пытаюсь изменить цвет - у меня в контроллере представления MapView.delegate = self:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
MKPinAnnotationView *pin = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:[annotation title]];

if (pin == nil) {
    pin = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:[annotation title]] autorelease];
}else {
    pin.annotation = annotation;
}

pin.pinColor = MKPinAnnotationColorGreen;
pin.animatesDrop = YES;
pin.canShowCallout = TRUE;
return pin;

}

Я получаю аннотации с заголовком и подзаголовком, но не с зелеными маркерами. Они всегда красные, если я использую цвета или изображения. Если бы кто-нибудь мог мне помочь, это было бы здорово!

Спасибо

EDIT:

Делегат mapView назначается в методе viewDidLoad. Я также добавляю оверлей к определенной части карты. Это работает нормально, я также вынул его и попробовал без того случая, когда это вызывало проблему, но это все еще не решало это.

- (void)viewDidLoad {
[super viewDidLoad];

MKCoordinateRegion cordRgn;

LusuAppAppDelegate *delegate =[[UIApplication sharedApplication]delegate];

if (delegate.CurrentLocation == 0) {
    cordRgn.center.latitude = (CENTRE_OF_POSITION_2_LAT);
    cordRgn.center.longitude = (CENTRE_OF_POSITION_2_LON);
    delegate.CurrentLocation = 1;
}else if (delegate.CurrentLocation == 1) {
    cordRgn.center.latitude = (CENTRE_OF_POSITION_1_LAT);
    cordRgn.center.longitude = (CENTRE_OF_POSITION_1_LON);  
    delegate.CurrentLocation = 0;
}

cordRgn.span.latitudeDelta = 0.009f;
cordRgn.span.longitudeDelta = 0.009f;


self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];

//add overlay
MKRasterOverlay *overlay = [[MKRasterOverlay alloc] init];
[overlay setCoordinate:CLLocationCoordinate2DMake(54.005508, -2.780507)];

MKMapRect mkrect;
MKMapPoint mkpointa, mkpointb;
mkrect.origin = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.016964, -2.794862));
mkpointa = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.016964, 2.000000));
mkpointb = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.001447, 2.013770));
mkrect.size.width = mkpointb.x - mkpointa.x;
mkrect.size.height = mkpointb.y - mkpointa.y;
overlay.boundingMapRect = mkrect;

mapView.delegate = self;

[mapView addOverlay:overlay];
[mapView setRegion:cordRgn animated:NO];
[self.mapView setShowsUserLocation:YES];

[self doAnnotations];

}

Функция doAnnotations - это код, показанный выше, но в цикле. Еще раз спасибо за вашу помощь.

1 Ответ

7 голосов
/ 02 января 2011

Ваш код выглядит хорошо для меня. Я подозреваю, что у вас есть ошибка в назначении делегата и mapView:viewForAnimation на самом деле не вызывается. MKMapView без делегата, обеспечивающего эту функцию, будет работать нормально, с красными выводами для всех аннотаций. Попробуйте добавить несколько операторов NSLog или установить точку останова в отладчике, чтобы убедиться, что вы действительно выполняете этот код.

Вы, вероятно, уже знаете это, но использование собственных изображений потребует от вас создания выводов, которые MKAnnotationView с, а не MKAnnotationPinView с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...