В 3.1 я использовал «закадровый» MKMapView для создания изображений карты, которые я могу вращать, обрезать и так далее, прежде чем представлять их пользователю. В 3.2 и 4.0 эта техника больше не работает совершенно правильно. Вот некоторый код, иллюстрирующий проблему, и моя теория.
// create map view
_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, MAP_FRAME_SIZE, MAP_FRAME_SIZE)];
_mapView.zoomEnabled = NO;
_mapView.scrollEnabled = NO;
_mapView.delegate = self;
_mapView.mapType = MKMapTypeSatellite;
// zoom in to something enough to fill the screen
MKCoordinateRegion region;
CLLocationCoordinate2D center = {30.267222, -97.763889};
region.center = center;
MKCoordinateSpan span = {0.1, 0.1 };
region.span = span;
_mapView.region = region;
// set scrollview content size to full the imageView
_scrollView.contentSize = _imageView.frame.size;
// force it to load
#ifndef __IPHONE_3_2
// in 3.1 we can render to an offscreen context to force a load
UIGraphicsBeginImageContext(_mapView.frame.size);
[_mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIGraphicsEndImageContext();
#else
// in 3.2 and above, the renderInContext trick doesn't work...
// this at least causes the map to render, but it's clipped to what appears to be
// the viewPort size, plus some padding
[self.view addSubview:_mapView];
#endif
когда карта загружается, я делаю снимок и заполняю ее в виде прокрутки
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView {
NSLog(@"[MapBuilder] mapViewDidFinishLoadingMap");
// render the map to a UIImage
UIGraphicsBeginImageContext(mapView.bounds.size);
// the first sub layer is just the map, the second is the google layer, this sublayer structure might change of course
[[[mapView.layer sublayers] objectAtIndex:0] renderInContext:UIGraphicsGetCurrentContext()];
// we are done with the mapView at this point, we need its ram!
_mapView.delegate = nil;
[_mapView release];
[_mapView removeFromSuperview];
_mapView = nil;
UIImage* mapImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
_imageView.image = mapImage;
[mapImage release], mapImage = nil;
}
Первая проблема заключается в том, что в 3.1 рендеринг в контекст запускает загрузку карты. Это больше не работает в 3.2, 4.0. Единственное, что я обнаружил, это вызвало бы загрузку, это временно добавить карту в представление (т.е. сделать ее видимой). Проблема в том, что карта отображает только видимую область экрана, плюс немного отступов. Рамка / границы в порядке, но, похоже, она «услужливо» оптимизирует загрузку, чтобы ограничить плитки теми, которые видны на экране или рядом с ним.
Есть идеи, как заставить карту загружаться в полном размере? У кого-нибудь еще есть эта проблема?