1

カスタム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];

}

だから、それはおそらくあなたが望んでいたよりも詳細です。ただし、注釈ビューが選択されているときにマップビューがズームアウトする理由がわからない場合は、チャイムを鳴らしてください。よろしくお願いします。

4

2 に答える 2

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呼び出しをもう一度見てください。あなたのスパンは間違っていると思います。リージョンをログに記録し、それがあなたの望むことをしているとき、そしてそれが根本的にズームアウトしたとき、それが何を設定するかを教えてください。

于 2012-08-14T01:06:30.340 に答える
0

これはおそらく解決されていますが、他の誰かが同じ問題を抱えている場合は、setRegionsetCenterCoordinateに置き換えてください。

アップルドコによると、setRegionはビュー内の注釈を想定し、それに応じてズームを変更します。setCenterCoordinateはそのような評価を行いませんが、マップの中心として指定した座標にマップを中央に配置するだけです。

それがしばらくの間私を悩ませていたので、これが誰かを助けることを願っています。

于 2012-11-20T10:14:37.660 に答える