Подтвердить что ты не робот

Обновить MKAnnotationView на MKMapView

Я хотел бы a-synload загрузить изображения для моего настраиваемого MKAnnotationView; Я уже использую EGOImageView-framework (он очень хорошо работает с UITableViews), но я не могу заставить его работать над MKMapView. Изображения кажутся загруженными, но я не могу их обновить на карте - [myMap setNeedsDisplay] ничего не делает.

4b9b3361

Ответ 1

Я сам не пробовал, но это может сработать:
Получить представление для аннотации с использованием метода MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation и установить для него новое изображение.

Изменить: Пытался сделать это сам, и этот подход работал отлично для меня:

//  Function where you got new image and want to set it to annotation view
for (MyAnnotationType* myAnnot in myAnnotationContainer){
    MKAnnotationView* aView = [mapView viewForAnnotation: myAnnot];
    aView.image = [UIImage imageNamed:@"myJustDownloadedImage.png"];
}

После вызова этого метода все изображения аннотаций были обновлены.

Ответ 2

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

id <MKAnnotation> annotation;

// ...

[mapView removeAnnotation:annotation];
[mapView addAnnotation:annotation];

Этот код сделает - [mapView: viewForAnnotation:] для повторного вызова и поэтому ваше представление аннотации будет создано снова (или, возможно, повторно использовано, если вы используете dequeueReusableAnnotationViewWithIdentifier) ​​с правильными данными.

Ответ 3

Это единственный способ заставить перерисовать MKAnnotationViews:

//принудительно обновить представление карты (иначе аннотации не будут перерисовываться)

CLLocationCoordinate2D center = mapView.centerCoordinate;

mapView.centerCoordinate = center;

Кажется бесполезным, но он работает.

Ответ 4

Это сработало для меня

#import "EGOImageView.h"

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    //ENTER_METHOD;    
    if([annotation isKindOfClass:[MKUserLocation class]]) return nil;  
    MKPinAnnotationView *annView;

    static NSString *reuseIdentifier = @"reusedAnnView";
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5.0f, 0.0f);
    annView.opaque = NO;
    annView.image = [[UIImage imageNamed:@"tempImage.png"] retain];

    YourModel *p = annotation; // make this conform to <MKAnnotation>
    EGOImageView *egoIV = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"tempImage.png"]];
    [egoIV setDelegate:self];
    egoIV.imageURL = [NSURL URLWithString:p.theUrlToDownloadFrom];
    [annView addSubview:egoIV];
    [egoIV release];


    return [annView autorelease];
}

Ответ 5

(Я не вижу, как указать, что это сообщение относится к ответу zerodiv.) Я смог получить метод zerodiv для работы, добавив кикстарт сортов, заставив бессмысленную, но другую координату, а затем восстановив предыдущую, правильную один. Экран вообще не мигает из-за первого местоположения.

CLLocationCoordinate2D center = mapView.centerCoordinate; 
CLLocationCoordinate2D forceChg;
forceChg.latitude = 0;
forceChg.longitude = curLongNum;

mapView.centerCoordinate = forceChg;
mapView.centerCoordinate = center;

Ответ 6

Я хотел обновить пин-код пользователя новым выбранным аватаром. Я нашел другое быстрое решение для этого случая. У меня 2 экрана. Первый предназначен для выбора аватара, а второй - для отображения пользователя на карте.

Свифт 5 Вы можете изменить изображение местоположения пользователя, создав MKAnnotationView

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    if annotation is MKUserLocation {
        let userIdentifier = "UserLocation"
        var userView = mapView.dequeueReusableAnnotationView(withIdentifier: userIdentifier)
        if userView == nil {
            userView = MKAnnotationView(annotation: annotation, reuseIdentifier: userIdentifier)
        } else {
            userView?.annotation = annotation
        }

        userView!.image = UIImage(named: "avatar1") //your image

        return userView
    }

    return nil
 }

Таким образом, если пользователь изменит аватар на что-то другое, например, на "avatar2", он не обновится.

Чтобы обновить изображение местоположения пользователя, я добавил этот код в viewWillAppear()

 self.mapView.showsUserLocation = false
 self.mapView.showsUserLocation = true