2010-11-18 3 views
8

Я использую эту функцию для рендеринга экземпляра MKMapView в образ:Rendering MKMapView к UIImage с реальным разрешением

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

Это прекрасно работает. Но с iphone4 рендеринг изображения не имеет такого же разрешения, как у него действительно на устройстве. На устройстве у меня есть качество изображения 640x920, а сделанное изображение имеет разрешение 320x460. Затем я удвоил размер, предоставляемый функции UIGraphicsBeginImageContext(), но который заполнил единственную верхнюю левую часть изображения.

Вопрос: Есть ли способ получить отображение карты в изображении с полным разрешением 640x920?

ответ

8

Попробуйте использовать UIGraphicsBeginImageContextWithOptions вместо UIGraphicsBeginImageContext:

UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0); 

См QA1703 для более подробной информации. Он говорит:

Примечание: Начиная с прошивкой 4, UIGraphicsBeginImageContextWithOptions позволяет вам обеспечить масштабный фактор. Масштабный коэффициент нуля устанавливает его на масштабный коэффициент главного экрана устройства . Это позволяет получить самый острый, самый высокий уровень разрешающей способности моментальный снимок дисплея, включая дисплей Retina Display .

+0

Спасибо! Тест прошел :) – Prcela

0

iOS 7 представил новый метод создания скриншотов MKMapView. Теперь можно использовать новый MKMapSnapshot API следующим образом:

MKMapView *mapView = [..your mapview..] 

MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc]init]; 
options.region = mapView.region; 
options.mapType = MKMapTypeStandard; 
options.showsBuildings = NO; 
options.showsPointsOfInterest = NO; 
options.size = CGSizeMake(1000, 500); 

MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc]initWithOptions:options]; 
[snapshotter startWithQueue:dispatch_get_main_queue() completionHandler:^(MKMapSnapshot *snapshot, NSError *error) { 
    if(error) { 
     NSLog(@"An error occurred: %@", error); 
    } else { 
     [UIImagePNGRepresentation(snapshot.image) writeToFile:@"/Users/<yourAccountName>/map.png" atomically:YES]; 
    } 
}]; 

В настоящее время все оверлеи и аннотации не отображаются. Вы должны сделать их впоследствии на результирующем снимке снимка самостоятельно. Предоставленный объект MKMapSnapshot имеет удобный вспомогательный метод для сопоставления между координатами и точками:

CGPoint point = [snapshot pointForCoordinate:locationCoordinate2D]; 
+0

Я получаю ошибку в этой строке 'options.mapType = MKMapTypeStandard; 'как я могу его решить. –

+1

@ KhushbuDesai Вы используете Swift? – Klaas

+0

Да и я получил решение 'options.mapType = .standard' –

Смежные вопросы