2012-08-13 15 views
1

사용자 지정 MKAnnotationView (PostFlag)가 선택되면 두 가지 작업을 수행하려고합니다. 1) 주석에 대한 세부 정보를 표시하도록 확장하고 2)지도의 가운데에 배치합니다. 문제는 주석이 선택 될 때 MKMapView가 때로는 극적으로 축소된다는 것입니다. 이로 인해 중요한 확대/축소 이벤트를 처리하기위한 논리가 실행되어 인접한 주석을 공통 주석보기로 수집하여 주석보기가 다시로드되게합니다. 주석보기는 닫힌 주석보기로 사용자가 보려고하는 주석을 대체합니다.주석을 선택하면 MKMapView가 축소됩니다.

이 문제를 해결하기위한 시도는 주석을 가운데 정렬하려고 할 때 영역을 잘못 (예 : 축소를 유발할 수있는 범위로) 설정하지 않도록 노력하여 시작되었습니다. 거기에있는 모든 것이 괜찮아 보입니다. 설정하면 지역이 정확합니다. 대리자 메서드 인 mapView : didChangeRegion : animated : 축소 된 영역에서도 여전히 호출됩니다. 나는 거기에 무슨 일이 일어나고 있는지 정확히 알지 못합니다.

주석을 가운데 맞추기 위해 영역을 변경하기 전에 scrollEnabled 및 zoomEnabled를 설정하면 효과가없는 것 같습니다.

주석보기의 확장을 애니메이션화했는지 여부는 문제가되지 않습니다. 여전히 확대/축소가 발생합니다.

누구에게도 익숙한 소리입니까? PostFlag가 붕괴 때이 뷰 컨트롤러와 VC 재 활성화 스크롤 및지도를 확대를 알려줍니다

- (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; 
    } 
} 

: 여기에 몇 가지 코드입니다. 따라서 주석보기가 확장되는 동안지도의 확대/축소 및 스크롤이 해제되어 있음을 명확히 알 수 있습니다.

- (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

0

이 아마 정리되었지만, 다른 넣다 사람이 같은 문제를 가지고, 단지 setCenterCoordinatesetRegion를 교체합니다.

setRegion은 Apple doco에 따라 뷰의 주석에 대한 가정을 만들고 그에 따라 줌을 변경합니다.setCenterCoordinate는 그러한 평가를하지 않고 맵의 중심으로 지정한 좌표에 맵을 중앙에 배치합니다.

호프가 누군가 나를 도왔을 때 도움이되기를 바랍니다.

+0

이것이 작동하지 않는 것 같습니다. – vinbhai4u

관련 문제