カスタムMKAnnotationView(PostFlag)が選択されたときに、2つのことを実行させようとしています。1)展開して注釈の詳細を表示し、2)マップの中央に配置します。問題は、注釈を選択すると、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が折りたたまれると、このView Controllerに通知され、VCはマップのスクロールとズームを再度有効にします。したがって、明確にするために、注釈ビューが展開されている間、マップのズームとスクロールはオフになっています。
- (void) postFlagWasCollapsed: (PostFlag*) flag
{
[self.expandedFlags removeObject: flag];
if([self.expandedFlags count] == 0)
{
m_mapView.scrollEnabled = YES;
m_mapView.zoomEnabled = YES;
}
}
また、明確にするために、どの注釈ビューが展開されるかについての配列を保持しています。ユーザーは近くの注釈ビューをタップして、前に展開したビューを閉じている間に展開できるため、2つの注釈ビューが同時に展開される場合があります。そのため、すべての注釈が閉じられるまでスクロール/ズームをオンに戻さないようにするために、配列を使用します。
- (void) postFlagWasExpanded: (PostFlag*) flag
{
if(!self.expandedFlags)
self.expandedFlags = [NSMutableArray array];
if([self.expandedFlags indexOfObject: flag] == NSNotFound)
[self.expandedFlags addObject: flag];
}
だから、それはおそらくあなたが望んでいたよりも詳細です。ただし、注釈ビューが選択されているときにマップビューがズームアウトする理由がわからない場合は、チャイムを鳴らしてください。よろしくお願いします。