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