사용자 지정 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];
}
아마도 그 이상의 내용을 원했을 것입니다. 그러나 주석보기가 선택 될 때지도보기가 왜 축소되는지에 대해 누구나 생각할 수있는 경우에는 미리 전화 해주세요. 미리 감사드립니다.
예! 지역을 잘못 설정하는 다른 코드로 밝혀졌습니다. 감사. – Ian