Вопрос по iphone, ipad – Загрузите MKMapView в фоновом режиме и создайте из него UIImage (iPhone и iPad)

4

У меня есть ситуация, когда мне нужен способ загрузки MKMapView с несколькими наложениями. Этот вид карты не должен отображаться на экране, единственная причина, по которой мне требуется его загрузка, состоит в том, чтобы создать изображение из карты для использования в другом месте.

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

Вот что я уже пробовал (безуспешно)

// Load the map view
Logs_Map_ViewController *mapViewController = [[Map_ViewController alloc] initWithNibName:@"Map_ViewController" bundle:nil];
mapViewController.GPSCoordinatesToPlot = [someDictionary objectForKey:kGPSCoords];

// Take a picture of the map
UIImage *mapImage = [mapViewController convertMapToImage];
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(mapImage)];
NSString *base64String = [imageData base64EncodedString];

НОТА Очень важно, чтобы приложение ожидало полной загрузки карты (чтобы изображение было создано правильно).

Ваш Ответ

3   ответа
0

mapViewDidFinishLoadingMap вMKMapViewDelegate протокол и хранить там свое изображение, я бы подумал. Это должно решить проблему необходимости ждать, пока карта загрузится, чтобы сохранить изображение.

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

О да. Вы правы, вы почти наверняка не сможете получить фактическое изображение карты без отображения mapView, потому что именно это заставляет его получать данные. Кроме того, и я говорю об этом только потому, что сообщество StackOverflow почти наверняка наполняет вас ответами, в которых говорится, что если я этого не сделаю, то это, вероятно, является нарушением условий обслуживания Google, когда данные MKMapView используются для чего-либо, кроме фактического отображения. карта. IANAL, и я не связан с Google, просто упомянул об этом. Несмотря на это, MKMapView на самом деле нельзя использовать как невидимый источник данных. strings42
Я пытался реализовать этот метод делегата, однако он никогда не вызывался, так как я никогда не отображал представление, содержащее представление карты. The Crazy Chimp
Ааа, понятно. Я не знал об этом как о проблеме - я сделал предположение, что было бы хорошо взять снимок карты и отправить его по электронной почте. Благодарю за разъяснение The Crazy Chimp
Вы можете вставить вид карты под вид вашего контроллера представления. Таким образом, само представление карты никогда не отображается, но, поскольку оно добавлено в иерархию представлений, методы делегата будут запущены. jmstone617
1

а может и не быть полезным, но это то, что я делаю в своей ситуации.

У меня есть табличное представление для места / бизнеса с 7 ячейками таблицы. Одна из ячеек таблицы содержит карту с пиндропом. Когда пользователь просматривает учреждение в первый раз, я запускаю быстрое условие, чтобы увидеть, кэшировано ли представление карты (или, скорее, сохранено как изображение). если изображение не существует, я загружаю свежий вид карты в ячейку и добавляю одну аннотацию пиндропа. После загрузки и отображения карты, и удаления аннотации я сохраняю слой вида в изображение, затем удаляю вид карты (и освобождаю его, так как нам нужно было сохранить делегата живым) из ячейки и заменяю новым новым изображением. Я предлагаю порождать фоновый поток, чтобы сохранить изображение / вставить в ячейку. Таким образом, представление таблицы не захлебывается.

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

Я знаю, что для полной загрузки карты важно, иначе ваше изображение будет сохранено серым, если карта не загружалась. если вы отбрасываете булавку, вам нужно убедиться, что ваш метод сохранения изображений срабатывает после того, как карта закончила загрузку (mapViewDidFinishLoadingMap :) и ваша аннотация была удалена (mapView: didAddAnnotationViews :). Только после того, как оба закончили, вы должны использовать метод для сохранения изображения. Я предлагаю использовать отложенный селектор. Я задерживаю это на 1 секунду.

Эта же концепция может быть применена и в других ситуациях. Суть в том, что, как говорится в strings42, вам нужно добавить видимый вид карты в свой вид, чтобы сделать снимок.

Задержка была недостающей частью. Даже после вызова метода didFinishLoadingMap я все еще видел серое изображение, пока не добавил задержку. Благодарность jmstone617
работал и для меня. мне это не нравится но это сработало. roocell
0

mapViewDidFinishRenderingMap:fullyRendered:

так, вы можете получить изображение карты от mapView здесь

- (UIImage *)renderToImage:(MKMapView *)mapView
{
  UIGraphicsBeginImageContext(mapView.bounds.size);
  [mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return image;
}

Похожие вопросы