Различные пользовательские изображения для каждого вывода

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

Вот как я сейчас работаю:

У меня есть все мои местоположения в массиве Locations (пользовательский класс с длинным, лат, именем, именем булавки).

в viewdidLoad я петлю этот массив и создаю свои контакты с каждым найденным объектом, см. следующий код:

for(int i = 0 ; i<[_locationList count] ; i++) { Location *item = [_locationList objectAtIndex:i]; CLLocationCoordinate2D coordinate; coordinate.latitude = item.locationLatitude; coordinate.longitude = item.locationLongitude; NSString *title = item.locationName; CustomAnnotation* ann = [CustomAnnotation new]; ann.name = title; ann.coordinate = coordinate; ann.pinName = [NSString stringWithFormat:@"pin%i.png",item.idPin]; [self.map addAnnotation:ann]; } 

Это довольно прямолинейно, частично из класса CustomAnnotation, который является следующим кодом:

 @interface CustomAnnotation : MKPointAnnotation <MKAnnotation>{ } @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSString *description; @property (nonatomic, retain) NSString *pinName; @end 

Это все из того, что я видел в Интернете, и я полагаю, что все правильно.

На мой взгляд, я все еще создаю очень классические булавки, у них просто есть еще одно свойство (pinName), поэтому он исходит из пользовательского класса.

Теперь, в viewForAnnotation, я абсолютно НЕ ИДЕЯ, как сказать ему, чтобы получить этот pinName и использовать его.

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { // If it's the user location, just return nil. if ([annotation isKindOfClass:[MKUserLocation class]]) return nil; // Handle any custom annotations. if ([annotation isKindOfClass:[MKPointAnnotation class]]) { // Try to dequeue an existing pin view first. MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"]; if (!pinView) { // If an existing pin view was not available, create one. pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"]; pinView.canShowCallout = YES; pinView.image = // I wanted to write annotation.pinName But it's just not that. pinView.calloutOffset = CGPointMake(0, 32); }else { pinView.annotation = annotation; } return pinView; } return nil; } 

Что мне не хватает? Я, очевидно, что-то делаю неправильно, но я не могу понять это, и я все еще очень смущен различиями между MKAnnotationsView & MKPointAnnotation & MKPinAnnotation, …

Дополнительная информация: имена контактов – «pinX.png», X – число от 1 до 12. Я просто хочу использовать это имя, чтобы программа могла найти его в ресурсах, где находится изображение.

Поскольку ваши аннотации имеют тип CustomAnnotation , было бы более точным проверить, являются ли аннотации такого типа вместо MKPointAnnotation .

Затем, annotation параметра annotation в ваш пользовательский класс позволит вам легко получить доступ к настраиваемым свойствам в нем следующим образом:

 CustomAnnotation *ca = (CustomAnnotation *)annotation; pinView.image = [UIImage imageNamed:ca.pinName]; 

Однако, поскольку изображение может быть различным для каждой аннотации, вы должны установить его после создания или удаления вида аннотации (не только в блоке if (!pinView) – иначе аннотация может закончиться повторным использованием представления из другая аннотация больше не отображается и отображается неправильное изображение).

Обновленный метод будет выглядеть так:

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { // If it's the user location, just return nil. if ([annotation isKindOfClass:[MKUserLocation class]]) return nil; // Handle any custom annotations. if ([annotation isKindOfClass:[CustomAnnotation class]]) { // Try to dequeue an existing pin view first. MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"]; if (!pinView) { // If an existing pin view was not available, create one. pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"]; pinView.canShowCallout = YES; pinView.calloutOffset = CGPointMake(0, 32); //NOTE: //If the calloutOffset needs to be different for each image, //then this line should also be set below with the image. } else { pinView.annotation = annotation; } //Set image on view AFTER we have a new or dequeued view //because image is based on each annotation... CustomAnnotation *ca = (CustomAnnotation *)annotation; pinView.image = [UIImage imageNamed:ca.pinName]; //Might want to check that the UIImage is not nil //in case pinName is invalid since that would result in //an invisible annotation view. If the UIImage is nil, //set pinView.image to some default image. return pinView; } return nil; } 

Для путаницы в различиях между классами MapKit см .:

  • Должен ли я использовать MKAnnotation, MKAnnotationView или MKPinAnnotation? , Несмотря на то, что этот вопрос отмечен MonoTouch, он по-прежнему применяется.

  • MKMapView, animateDrop? также может помочь.

  • MKPinAnnotationView не центрирован
  • Узнайте о NSXMLParser в iOS
  • UIImageView как callout's leftCalloutAccessoryView автоматически перемещает верхний левый угол
  • Добавление нескольких аннотаций к карте, но все показывают некоторые из этих же данных
  • Действие кнопки в режиме mkannotation не работает?
  • Показывать адрес в аннотации, когда пин-код отбрасывается на карту
  • Как изменить изображение аннотации для координаты?
  • Лучший способ удалить некоторые аннотации из MKMapView
  • добавить mkannotation на сенсорную карту
  • Изменение размера изображения MKAnnotationView Когда приближаются и масштабируются карты?
  • iOS 8 MKAnnotationView rightCalloutAccessoryView смещен
  • Interesting Posts

    iOS Storyboard – Переключение представления на другой контроллер представления на том же иерархическом уровне

    «Нет такого модуля», когда я использую CocoaPods

    неправильный рекламный идентификатор , но он не

    Uicollectionview шахматная сетка

    Как сохранить и сохранить пользовательские данные ввода поля текстового поля при прокрутке ячеек deque

    MWPhotoBrowser: показывать субтитры для каждой фотографии

    MonoTouch.Dialog: GlassButton в разделе

    Тамильский шрифт в iOS

    Проблема повторного использования UITableViewCell. Изменение одной ячейки влияет на других

    Apple Verification Email, запрошенный для идентификатора пользователя Sandbox Tester

    Исходный текст и paperclipped-URL для действия в UIActivityViewController и UIActivityItemSource?

    Структура основного представления UIViewController внутри UINavigationViewController

    iPhone App Отклонено Apple с сообщением о сбое – не может воспроизвести

    Способ применения zRotation так, чтобы он влиял на SKPhysicsBody соответственно?

    Почему переменная __block перемещается в кучу до того, как блок скопирован?

    Давайте будем гением компьютера.