MKMapView вне экрана ведет себя по-разному в 3.2, 4.0 - PullRequest
3 голосов
/ 28 мая 2010

В 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. Единственное, что я обнаружил, это вызвало бы загрузку, это временно добавить карту в представление (т.е. сделать ее видимой). Проблема в том, что карта отображает только видимую область экрана, плюс немного отступов. Рамка / границы в порядке, но, похоже, она «услужливо» оптимизирует загрузку, чтобы ограничить плитки теми, которые видны на экране или рядом с ним.

Есть идеи, как заставить карту загружаться в полном размере? У кого-нибудь еще есть эта проблема?

...