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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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) {

        }];
    }

Ответ 2

В 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;
}

Источник:

Ответ 3

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

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

1, Программно закрыть окно

2, Запрограммируйте показ infowindow для того же маркера снова

Ответ 4

@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
                            }
                    }
                }
            }

Ответ 5

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

     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".

Ответ 6

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

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

marker.title = "my marker"
marker.tracksInfoWindowChanges = true