Создайте UIImage из MKMapView - PullRequest
8 голосов
/ 12 ноября 2010

Я хочу создать UIImage из MKMapView.Моя карта корректно отображается в виде, но полученное UIImage - просто серое изображение.Вот соответствующий фрагмент.

UIGraphicsBeginImageContext(mapView.bounds.size);
[mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
mapImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Кто-нибудь знает, как сделать UIImage с помощью MapKit?

Ответы [ 6 ]

8 голосов
/ 18 ноября 2010

Я использую тот же код, который протестирован с ios sdk 4.1 и работает нормально. Таким образом, когда карта уже отображается пользователю и пользователь нажимает кнопку, это действие будет вызвано:

UIImage *image = [mapView renderToImage];

и вот функция-обертка, реализованная как расширение UIView:

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

Итак, проблема не в этой части кода.

4 голосов
/ 08 октября 2013

В iOS7 для MapKit существует новый API, который называется MKMapSnapshotter.Таким образом, вам на самом деле не нужно создавать вид карты, загружать плитки и создавать графический контекст, который захватывает вас самим.

3 голосов
/ 24 ноября 2010

Вот улучшенная функция для отображения сетчатки:

@implementation UIView (Ext)
- (UIImage*) renderToImage
{
  // IMPORTANT: using weak link on UIKit
  if(UIGraphicsBeginImageContextWithOptions != NULL)
  {
    UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
  } else {
    UIGraphicsBeginImageContext(self.frame.size);
  }

 [self.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();   
 return image;
}
1 голос
/ 24 декабря 2013

Обратите внимание, что mapView может не завершить загрузку, поэтому изображение может быть серым.так как

mapViewDidFinishLoadingMap:

будет вызываться не всегда, вы должны получить UIImage в

mapViewDidFinishRenderingMap:fullyRendered:

, поэтому код такой же

- (UIImage *)renderToImage:(MKMapView *)mapView
{
  UIGraphicsBeginImageContext(mapView.bounds.size);
  [mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return image;
}
1 голос
/ 12 ноября 2010

Привет, Лорен. В mapView есть несколько слоев. Я думаю, что первая карта, а вторая - слой Google. Они могли бы что-то изменить в mapkit после 3.1. Вы можете попробовать

[[[mapView.layer sublayers] objectAtIndex:1] renderInContext:UIGraphicsGetCurrentContext()];

Вы также можете попробовать

CGRect rect = [mapView bounds];
CGImageRef mapImage = [mapView createSnapshotWithRect:rect];

Надеюсь, это поможет.

0 голосов
/ 12 ноября 2010

Если вы вызываете это сразу после инициализации карты (возможно, в viewDidLoad?), Вы можете получить серое изображение, поскольку карта еще не закончила рисовать.

Попробуйте:

  • Вызов кода захвата с использованием executeSelector: withObject: afterDelay: использование короткой задержки (может сработать даже 0 секунд, поэтому он срабатывает сразу после завершения текущего метода)
  • Если вы добавляете аннотации, вызовите код захватав методе делегата didAddAnnotationViews

Редактировать:
На симуляторе с помощью executeSelector работает нулевая задержка.На устройстве требуется более длительная задержка (около 5 секунд).

Однако, если вы добавляете аннотации (и записываете их в методе didAddAnnotationViews), он сразу же работает как на имитаторе, так и на устройстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...