Измените MKMapType в MKMapView и сохраните собственный pinImage для аннотаций.

Я установил собственный pinImage для своих аннотаций, и когда я меняю тип на MKMapTypeHybrid, он возвращает настройку pinImage к стандартным контактам.

Я устанавливаю тип карты в моем методе viewWillAppear контроллера представления карты. Я устанавливаю свой pinImage для аннотаций следующим образом (сокращенно для ясности):

- (MKAnnotationView *) mapView:(MKMapView *) mapView viewForAnnotation:(id ) annotation {

    MKPinAnnotationView *customAnnotationView=[[[MKPinAnnotationView alloc] 
                                            initWithAnnotation:annotation 
                                            reuseIdentifier:@"markerAnnotationView"] autorelease];
    UIImage *pinImage = [UIImage imageNamed:@"/pin-image"];
    [customAnnotationView setImage:pinImage];
    return customAnnotationView;
}

Есть ли способ использовать setImage и установить тип карты с помощью кода?


person conceptDawg    schedule 27.02.2011    source источник
comment
Вы где-нибудь автоматически выпускаете или выпускаете pinImage?   -  person Ajay    schedule 28.02.2011
comment
Нет. Просто встроенный автоматический выпуск из метода imageNamed. И я добавил туда сохранение утечки памяти, просто чтобы посмотреть, решит ли это исчезновение pinImage, но это не помогло.   -  person conceptDawg    schedule 28.02.2011
comment
Установка mapType не должна влиять на изображения аннотаций. Показ полного кода viewForAnnotation может помочь. Делает ли viewWillAppear что-нибудь, кроме установки mapType?   -  person    schedule 28.02.2011
comment
Это практически весь код viewForAnnotation. Я взял некоторый код, который делал некоторые вещи с аннотацией (не annotationView). Я сократил это до того, что показано здесь, и у него все еще есть проблема. И я пытался изменить тип карты в loadView, viewDidLoad и в viewWillAppear. Все с теми же результатами.   -  person conceptDawg    schedule 28.02.2011
comment
Не уверен, что это вызовет проблему, с которой вы столкнулись, но даже если это не так: вы должны использовать dequeueReusableAnnotationViewWithIdentifier в методе viewForAnnotation вместо того, чтобы каждый раз создавать новое представление. Типичную реализацию viewForAnnotation см. в примерах приложений MapCallouts или WeatherMap.   -  person    schedule 28.02.2011
comment
Спасибо. Это было там, но я убрал его, чтобы попытаться выявить первопричину. Но хорошо бы отметить, на всякий случай. В любом случае, я нашел проблему и, как обычно в подобных случаях, чувствую себя идиотом. Я перешел с MKPinAnnotationView на MKAnnotationView, и все работает хорошо. Я добавлю ответ на этот счет.   -  person conceptDawg    schedule 28.02.2011
comment
Отлично! Теперь это кажется таким очевидным — не могу поверить, что пропустил это.   -  person    schedule 28.02.2011


Ответы (1)


Решением этой проблемы было использование MKAnnotationView вместо MKPinAnnotationView. Раньше я использовал MKPinAnnotationView по уважительной причине, но позже добавил пользовательское изображение на булавку, не меняя класс создания экземпляра на MKAnnotationView.

Теперь я думаю, что это, вероятно, ошибочное поведение фреймворка. Если вы собираетесь разрешить MKPinAnnotationView принимать вызов setImage, убедитесь, что он правильно обрабатывает его при изменении типов карт. Если вы хотите, чтобы они только делали булавки, ничего не делайте с вызовом. Ах хорошо.

person conceptDawg    schedule 28.02.2011