Добавление разных изображений в разные виды аннотаций в xcode
Я пытаюсь добавить разные изображения к разным видам аннотаций, другими словами, я хочу, чтобы уникальный рисунок соответствовал каждому уникальному штырьку. Вот что я пытаюсь:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
NSLog(@"welcome into the map view annotation");
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// try to dequeue an existing pin view first
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];
pinView.animatesDrop=YES;
pinView.canShowCallout=YES;
pinView.pinColor=MKPinAnnotationColorPurple;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
if (CLLocationCoordinate2D == theCoordinate1) {
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Jeff.png"]];
pinView.leftCalloutAccessoryView = profileIconView;
[profileIconView release];
}else if(CLLocationCoordinate2D = theCoordinate2) {
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Pierce.png"]];
pinView.leftCalloutAccessoryView = profileIconView;
[profileIconView release];
}
Я получаю сообщение об ошибке для строки, где я пишу
if (CLLocationCoordinate2D == theCoordinate1) {
Я не совсем уверен, что не так, и я не могу найти другой способ идентифицировать отдельную аннотацию. Любая помощь с благодарностью!
1 ответ
Эта строка дает ошибку, потому что CLLocationCoordinate2D
это тип структуры и theCoordinate1
Я полагаю, переменная типа CLLocationCoordinate2D
, Вы не можете сравнить два.
То, что вы пытаетесь сделать, это сравнить координаты текущей аннотации, для которой запрашивается представление, с координатами в theCoordinate1
, Для этого вам нужно что-то вроде этого:
if ((annotation.coordinate.latitude == theCoordinate1.latitude)
&& (annotation.coordinate.longitude == theCoordinate1.longitude)) {
Однако я не рекомендую сравнивать числа с плавающей запятой таким образом, даже если это иногда "работает". Если вы должны сравнить координаты, используйте CLLocation's distanceFromLocation:
метод и посмотреть, если расстояние между ними ниже некоторого порога, как 10,0 метров.
Другой способ проверить, нужна ли аннотация, - это сохранить ссылку на саму аннотацию (ту, которую вы передали addAnnotation:
метод), а затем вы можете сделать if (annotation == theAnnotation1)
,
Если вы не хотите сохранять ссылку на аннотации, вы также можете проверить, является ли заголовок аннотации тем, который вы ищете (if ([annotation.title isEqualToString:@"Jeff"])
).
Лучший способ - добавить пользовательское свойство (в идеале int) в пользовательский класс аннотаций и проверить это в viewForAnnotation.
Несколько других не связанных вещей:
- Вместо того, чтобы делать addTarget, обработайте нажатие кнопки в собственном представлении карты
calloutAccessoryControlTapped
метод делегата, который даст ссылку на аннотацию (например, см. Как найти аннотацию, отправляющую showDetails?). - У вас есть комментарий к "dequeue", но вы этого не делаете. Рекомендуется использовать
dequeueReusableAnnotationViewWithIdentifier
в viewForAnnotation для повторного использования представлений (см., например, EXC_BAD_ACCESS с MKPinAnnotationView).