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

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

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

У меня есть все мои местоположения в массиве 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? также может помочь.

  • MKAnnotation с пользовательским bubleview в кнопке ввода для ios?
  • Как изменить высоту окна выводов аннотации Swift
  • Не удалось передать UIImage в MKPinAnnotationView
  • MKPinAnnotationView не центрирован
  • viewForAnnotation путаница и настройка pinColor итеративно
  • Как добавить изображение для каждой настраиваемой аннотации в MapView?
  • Почему мой вид отображения карты прозрачный / прозрачный и как мне изменить его цвет?
  • Как создать пользовательский MKAnnotationView и пользовательский заголовок аннотации и субтитры
  • Поворот аннотации местоположения пользователя заголовком
  • Обновление AnnotationView после / во время масштабирования
  • Пользовательский MKAnnotationView - Как фиксировать штрихи и НЕ отклонять выноску?
  • Interesting Posts

    Использование Twilio API / SDK для создания базового телефонного приложения на iOS

    Композиция UIViews с фрагментарным шейдером

    Как установить UIActivityViewController Gmail Share Тема отличается от тела

    Nativescript: Сделайте ширину полосы прокрутки ярлыка, затем оберните ее максимальной шириной

    Как вы используете setTitleTextAttributes: forState в UIBarItem?

    UINavigationBar и новый API внешнего вида iOS 5+ – как предоставить два фоновых изображения?

    Элегантный способ предотвращения одновременного вызова метода разными сущностями

    Достижение разыгрывания игрового центра несколько раз

    приложение для загрузки приложений apple push notification

    Скопировать файл PDF в библиотеку iBooks

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

    Как изменить выбранный цвет текста даты в swift 3.0

    Локальные уведомления, не работающие для некоторых пользователей (iOS 8)

    Ошибка EXC_BAD_ACCESS в представлении UIImagePNGR при включении Guard Malloc

    Посещения служб iOS и системы Частое размещение

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