2012-08-13 67 views
1

我想要一個自定義的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]; 

} 

所以這可能比你想要的更多細節。但是,如果任何人有任何想法,爲什麼選擇註解視圖時地圖視圖縮小,請提前致謝。

回答

1

我不認爲scrollEnabled意味着你的想法。它阻止用戶滾動,但它不會阻止代碼告訴地圖滾動。同樣適用於縮放。

「如果將此屬性的值設置爲NO,則仍可以通過更改region屬性中的值以編程方式更改地圖位置。」

編號:http://developer.apple.com/library/ios/DOCUMENTATION/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/occ/instp/MKMapView/scrollEnabled

所以忘了scrollEnabled插手。再看看你的setRegion調用。我會認爲你的跨度出錯了。記錄該地區,並告訴我們當它做你想要的和當它從根本上縮小時它所設置的。

+0

是的!原來是其他代碼錯誤地設置區域。謝謝。 – Ian 2012-11-30 18:18:39

0

這可能已經整理出來,但櫃面別人有同樣的問題,只需更換setRegionsetCenterCoordinate

根據apple doco,setRegion將對視圖中的註釋做出假設,並相應地更改縮放比例。setCenterCoordinate不會做出這樣的評估,只需將地圖放在您指定的座標中心作爲地圖的中心。

希望這可以幫助別人,因爲它也給我留下了一段時間。

+0

這似乎並沒有工作, – vinbhai4u 2015-11-04 10:08:31