我想要一個自定義的MKAnnotationView(PostFlag)當它被選中時做兩件事:1)展開以顯示關於註釋的細節,並且2)在地圖中居中。麻煩的是,當選擇註解時,MKMapView有時會顯着縮小。這會導致我的邏輯處理重要縮放事件的運行,這會將附近的註釋收集到常見的註釋視圖中,導致註釋視圖重新加載,這往往會用關閉的註釋視圖替換用戶試圖查看的註釋。選擇註解導致MKMapView縮小
我試圖解決這個問題時,試圖確保當我嘗試將註釋居中時,我沒有錯誤地設置該區域(例如會導致縮小的跨度)。那裏的一切似乎都沒問題 - 當我設置它時,該區域是正確的。委託方法mapView:didChangeRegion:animated:仍然被調用,但縮小區域。我不確定那裏發生了什麼。
在將區域更改爲居中註釋之前,將scrollEnabled和zoomEnabled設置爲NO似乎沒有任何作用。
如果我爲註釋視圖的擴展動畫製作動畫並不重要 - 縮放仍然會發生。
這聽起來對任何人都很熟悉嗎?下面是一些代碼:
- (void) mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
self.selectedFlag = (PostFlag*)view; //disables scrolling/zooming on the map
//move region to show expanded flag
float size = (m_selectedFlag.expandedHeight/2.0) + 50; //getting a comfortable position in the display
float dLat = size * mapView.region.span.latitudeDelta/mapView.frame.size.height; //get span in degrees from degree to pixel ratio
//build a new coordinate for our center location
CLLocationCoordinate2D originalCoord = ((PostAnnotation*)m_selectedFlag.annotation).coordinate;
CLLocationCoordinate2D offsetCoord = CLLocationCoordinate2DMake(originalCoord.latitude + dLat, originalCoord.longitude);
//adjust the map view to center on that new coordinate
[m_mapView setRegion: MKCoordinateRegionMake(offsetCoord, m_mapRegionAtTimeOfLastUpdate.span) animated: YES];
}
- (void) setSelectedFlag:(PostFlag *) val
{
if(m_selectedFlag)
{
m_selectedFlag.expanded = NO;
[m_selectedFlag release];
}
if(val)
m_selectedFlag = [val retain];
else
m_selectedFlag = nil;
if(m_selectedFlag)
{
m_selectedFlag.expanded = YES;
[m_mapView bringSubviewToFront: m_selectedFlag];
m_mapView.scrollEnabled = NO;
m_mapView.zoomEnabled = NO;
}
else
{
m_mapView.scrollEnabled = YES;
m_mapView.zoomEnabled = YES;
}
}
當PostFlag崩潰,它告訴這個視圖控制器和VC重新啓用滾動和縮放地圖。所以,爲了清楚起見,當註解視圖展開時,地圖上的縮放和滾動關閉。
- (void) postFlagWasCollapsed: (PostFlag*) flag
{
[self.expandedFlags removeObject: flag];
if([self.expandedFlags count] == 0)
{
m_mapView.scrollEnabled = YES;
m_mapView.zoomEnabled = YES;
}
}
此外,爲了澄清,我保留了什麼註釋視圖展開的數組。由於用戶可以點擊附近的註釋視圖並在先前展開的視圖關閉的同時展開,因此可能會同時擴展兩個註釋視圖。因此,爲了確保我不再打開滾動/縮放,直到所有註釋都關閉,我使用該數組。
- (void) postFlagWasExpanded: (PostFlag*) flag
{
if(!self.expandedFlags)
self.expandedFlags = [NSMutableArray array];
if([self.expandedFlags indexOfObject: flag] == NSNotFound)
[self.expandedFlags addObject: flag];
}
所以這可能比你想要的更多細節。但是,如果任何人有任何想法,爲什麼選擇註解視圖時地圖視圖縮小,請提前致謝。
是的!原來是其他代碼錯誤地設置區域。謝謝。 – Ian 2012-11-30 18:18:39