Как принудительно обновить содержимое markerInfoWindow в Google Maps iOS SDK

Я возвращаю UIImageView in - (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker;

Этот UIImageView загружает изображения динамически через URL-адрес, используя SDWebImage.

Как говорится в документации об информационных окнах маркера:

Примечание. Информационное окно отображается в виде изображения каждый раз, когда оно отображается на карте. Это означает, что любые изменения его свойств, пока он активен, не будут видны сразу. Содержимое информационного окна будет обновлено при следующем отображении.

Дело в том, что после загрузки изображения информационное окно не обновляется и продолжает показывать изображение-заполнитель до тех пор, пока пользователь не скроет его, а затем снова не покажет его.

Поэтому мне нужно принудительно обновить содержимое markerInfoWindow в блоке загруженного изображения.


person Shady Elyaski    schedule 27.06.2013    source источник


Ответы (6)


В GoogleMaps iOS SDK 1.13.0 и выше они добавили эту функцию. Чтобы включить это, просто установите для свойства tracksInfoWindowChanges на GMSMarker значение YES.

Пример:

- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
    marker.tracksInfoWindowChanges = YES;

    MyInfoWindow *infoWindow = [[MyInfoWindow alloc] init];
    [infoWindow.imageView sd_setImageWithURL:imageUrl];
    return infoWindow;
}

Источник:

person Enrico Susatyo    schedule 06.05.2016
comment
почему им потребовалось 3 года, чтобы реализовать это с момента предложения? это страшно - person cspam; 28.06.2016

Вот как я решил проблему, используя обходной путь ниже:

UIImage *img = [[SDWebImageManager sharedManager] imageWithURL:[NSURL URLWithString:Img_URL]]; //Img_URL is NSString of your image URL
    if (img) {       //If image is previously downloaded set it and we're done.
        [imageView setImage:img];
    }else{
        [imageView setImageWithURL:[NSURL URLWithString:Img_URL] placeholderImage:[UIImage imageNamed:@"defaultPin"] success:^(UIImage *image, BOOL cached) {
            if (!marker.snippet || !cached) {
                [marker setSnippet:@""];                 //Set a flag to prevent an infinite loop
                if (mapView.selectedMarker == marker) {  //Only set if the selected marker equals to the downloaded marker
                    [mpVu setSelectedMarker:marker];
                }
            }
        } failure:^(NSError *error) {

        }];
    }
person Shady Elyaski    schedule 28.06.2013
comment
Этот ответ больше не является правильным, см. ответ @Enrico Susatyo ниже (stackoverflow.com/a/37064936/1305067). - person paulvs; 09.10.2016

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

Вы можете выполнить следующие шаги:

1, программно закрыть информационное окно

2, Программное отображение информационное окно для того же маркера снова

person tony m    schedule 27.06.2013

Swift на основе решения Enrico Susatyo:

установив для свойства tracksInfoWindowChanges объекта GMSMarker значение true

marker.title = "my marker"
marker.tracksInfoWindowChanges = true
person Musa almatri    schedule 12.09.2017

Ответ @Shady Elyaski великолепен, вот быстрая переинтерпретация с Parse, на случай, если кому-то еще понадобится.

    var eventThumb:UIImage?
    ...

    func mapView(mapView: GMSMapView!, markerInfoWindow marker: GMSMarker!) -> UIView! {


    ...
    //set up the rest of your view...
        if let eventImgExists = eventThumb {
                    eventImg.image = eventImgExists
                    self.eventThumb = nil
                } else {
                    if let currentEventThumb = currentEvent["thumbnail"] as? PFFile {
                        currentEventThumb.getDataInBackgroundWithBlock {
                            (imageData, error) -> Void in
                            if error == nil {
                                let image = UIImage(data: imageData!)
                                eventImg.image = image
                                self.eventThumb = image
                                self.eventsMap.selectedMarker = self.eventsMap.selectedMarker
                            }
                    }
                }
            }
person MQLN    schedule 14.11.2015

Вот ты где . всего несколько строк простого кода. Это работает отлично для меня. Добавьте эти строки кода сразу после того, как вы закончите загрузку изображения, которое я имею в виду в вашем завершенииBlock.

     let image = UIImage(contentsOfFile: fileURL.path!)

      marker.image  = image

            if(self.mapView.selectedMarker != nil)
            {
              if(self.mapView.selectedMarker == marker)
              {
                self.mapView.selectedMarker = nil
                self.mapView.selectedMarker =  marker
              }
            }

Тогда это работает так чертовски здорово. Содержимое немедленно перезагружается с новым изображением. В основном вам все равно нужно назначить новое изображение вашему marker.image, чтобы использовать его в методе «markerInfoContents».

person Đức Anh    schedule 05.04.2016