我一直有MKMapView(報告給蘋果,但沒有迴應)持續的內存泄漏問題,所以作爲解決方法,我試圖只分配一個MKMapView並重新使用而不是重新分配一個新的地圖。我遇到的問題是我還沒有能夠重置MKMapView到它開始的視圖。我想,因爲我從美國工作,我最初得到這樣一個觀點:MKMapView重置回到世界的視圖:被重新燒烤
map of USA http://www.cprince.com/stackoverflow/map1.png
有了這個代碼:
static MKMapView *map = nil;
- (void) showUserLocation {
[map setShowsUserLocation:YES];
CLLocationCoordinate2D coord;
coord.latitude = 39.0; // changed from original coords
coord.longitude = -105.0;
MKCoordinateRegion r = MKCoordinateRegionMakeWithDistance(coord, 1000, 1000);
[map setRegion:r animated:YES];
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (! map) {
CGRect r = CGRectMake(20, 50, 196, 75);
map = [[MKMapView alloc] initWithFrame:r];
defaultRegion = MKCoordinateRegionMake(map.centerCoordinate, MKCoordinateSpanMake(180, 360));
} else {
[map setRegion:defaultRegion animated:YES];
}
[self.view addSubview:map];
}
- (IBAction)annotateMap:(id)sender {
[self showUserLocation];
}
當我點擊調用annotateMap按鈕,我得到如下圖(沒有驚喜但):
map of my home http://www.cprince.com/stackoverflow/map2.png
,當我離開導航(使用導航控制LER)從該視圖,然後重新進入視圖(viewWillAppear中再次呼籲,但這次重新使用的MKMapView以前分配的),我得到下面的地圖視圖:
map of ocean http://www.cprince.com/stackoverflow/map3.png
,當然還有我應該得到原來的默認區域,因爲viewWillAppear中的這一部分:
defaultRegion = MKCoordinateRegionMake(map.centerCoordinate, MKCoordinateSpanMake(180, 360));
} else {
[map setRegion:defaultRegion animated:YES];
}
如果做setRegion的addSubview或之前之後不要緊。也就是說,下面的改變不能解決probelem:
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
BOOL firstTime = NO;
if (! map) {
firstTime = YES;
CGRect r = CGRectMake(20, 50, 196, 75);
map = [[MKMapView alloc] initWithFrame:r];
defaultRegion = MKCoordinateRegionMake(map.centerCoordinate, MKCoordinateSpanMake(180, 360));
}
[self.view addSubview:map];
if (! firstTime) {
[map setRegion:defaultRegion animated:YES];
}
}
,並使用MKMapRectWorld並沒有幫助:
defaultRegion = MKCoordinateRegionForMapRect(MKMapRectWorld);
的問題也不會因某種具有的MKMapView競爭條件。如果我改變按鈕的處理程序:
- (IBAction)annotateMap:(id)sender {
defaultRegion = MKCoordinateRegionMake(map.centerCoordinate, MKCoordinateSpanMake(180, 360));
[self showUserLocation];
}
,等到地圖上查看美國定居之前,我按一下按鈕,問題是一樣的。
我正在使用iOS 6.1.2和XCode 4.6。
(完整的XCode項目可在http://www.cprince.com/stackoverflow/Map.zip)。
想法?
第一個變化
我做了defaultRegion靜態,而不是一個實例變量,這不會發生顯着變化的情況。 (我在下面報告了默認區域的lat/long)。這裏的結果在地圖:
map of ocean http://www.cprince.com/stackoverflow/map4.png
爲了清楚起見,因爲就目前的代碼是:
static MKMapView *map = nil;
static MKCoordinateRegion defaultRegion;
- (void) showUserLocation {
[map setShowsUserLocation:YES];
CLLocationCoordinate2D coord;
coord.latitude = 39.0; // changed from original
coord.longitude = -105.0;
MKCoordinateRegion r = MKCoordinateRegionMakeWithDistance(coord, 1000, 1000);
[map setRegion:r animated:YES];
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
BOOL firstTime = NO;
if (! map) {
firstTime = YES;
CGRect r = CGRectMake(20, 50, 196, 75);
map = [[MKMapView alloc] initWithFrame:r];
defaultRegion = MKCoordinateRegionMake(map.centerCoordinate, MKCoordinateSpanMake(180, 360));
NSLog(@"defaultRegion: center: lat: %f, long: %f; span: %f dlat: dlong: %f", defaultRegion.center.latitude, defaultRegion.center.longitude, defaultRegion.span.latitudeDelta, defaultRegion.span.longitudeDelta);
//defaultRegion = MKCoordinateRegionForMapRect(MKMapRectWorld);
}
[self.view addSubview:map];
if (! firstTime) {
NSLog(@"defaultRegion: center: lat: %f, long: %f; span: %f dlat: dlong: %f", defaultRegion.center.latitude, defaultRegion.center.longitude, defaultRegion.span.latitudeDelta, defaultRegion.span.longitudeDelta);
[map setRegion:defaultRegion animated:YES];
}
}
- (IBAction)annotateMap:(id)sender {
//defaultRegion = MKCoordinateRegionMake(map.centerCoordinate, MKCoordinateSpanMake(180, 360));
[self showUserLocation];
}
你嘗試設置動畫屬性設置爲否的區域? – Adis 2013-03-21 22:25:20
您是否檢查過首次加載頁面時defaultRegion中的值?也許你並沒有讓自己認爲的那個地區成爲現實。例如,如果它可能失敗,因爲你不在(0,0),而是給它一個180x360的範圍,所以它會進入無效座標。 – Craig 2013-03-21 23:37:31
將設置爲動畫設置爲NO的區域不會改變情況。剛剛嘗試過。 – 2013-03-22 00:49:03