2011-07-24 13 views
1

私がしたいことは、http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/で説明されているように、カスタムコールアウトバブルをMKMapViewで作成することですが、そうでなければきれいに行われたアプリケーションにはいくつかのバグがあるようです。たとえば、カスタムのコールアウトバブルを開いたままにしてスクロールすると、ある時点で、マップが開いているコールアウトにスクロールします。また、ズームするとこのバグが発生することがあります。誰もがそれらの問題を解決することができましたか?新しい質問を作成して申し訳ありません(カスタム吹き出しバブルに対処するカップルがあるため)、回答にコメントするのに十分な担当者ポイントがありませんでした。カスタマイズされたコールアウトバブルMKMapView

+0

この例では、コールアウトを閉じる必要があるコードはありますか?おそらくここで関連する抜粋を提供することができ、なぜそれがうまくいかないかを調べることができます。 – progrmr

+0

私は、リンゴの動作を模倣するときに、コードを閉じてしまうと考えていません。 – xci

+0

これは間違いなくバグです。私はこのコードをしばらく使っていますが、この場合は決して実行しませんでした。基本的に、吹き出しの吹き出しをスクロールして表示してから地図をタップすると、注釈をタップしていると考えられ、吹き出しが表示されないので、吹き出しが表示されるように画面を再調整しています。これでしばらくの間仕事をしなければならない。バグを見つけてくれてありがとう。 – Rayfleck

答えて

-1

この修正は、注釈の選択を解除する場合はCalloutMapAnnotationView:didMoveToSuperview、 になり、adjustMapRegionIfNeededは呼び出さないでください。

mapViewController:didDeselectAnnotationViewに固定されている方法は、mapViewからremoveAnnotationを呼び出す前に、ゼロ以外のタグ値をBasicMapAnnotationViewに割り当てます。私はCalloutMapAnnotationViewに、私はこの値をチェックし、見つかった場合、私はマップを調整していない、そして、

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { 

// distinguish between the map deselecting this and the user tapping on the callout. 
// in the former case, we want to deselect as normal; latter case, show coupon detail. 

if ([view isKindOfClass:[BasicMapAnnotationView class]]) { 
    if (((BasicMapAnnotationView *)view).calloutMapAnnotation) { 
     if (!((BasicMapAnnotationView *)view).preventSelectionChange) { 
      ((BasicMapAnnotationView *)view).tag = 159; // prevent adjusting map - see CalloutMapAnnotationView 
      [mapView removeAnnotation: ((BasicMapAnnotationView *)view).calloutMapAnnotation]; 
      // if we're deselecting the currently selected one, null out self.selectedAnnotationView 
      // Otherwise, the map view is deselecting this one in order to select another one 
      // and the timing is such that this nulling happens first, and the newly set AV would have no value for this. 
      if ((BasicMapAnnotationView *)view == self.selectedAnnotationView) { 
       self.selectedAnnotationView=nil; 
      } 
      ((BasicMapAnnotationView *)view).calloutMapAnnotation = nil; 
     } 
    } 
} 
} 

159を選びました。

- (void)didMoveToSuperview { 
if (self.parentAnnotationView) { 
    if (self.parentAnnotationView.superview) { 
     // null superview means it's been removed from map, and adjustMap gets wrong parentOrigin based on null superview, 
     // and recenters the map somewhere in Antarctica. The Ross Ice Shelf has no coupons except for frozen penguin eggs. 

     if (self.parentAnnotationView.tag != 159) {// Don't adjust map region on deselect. 
                //159 hardcoded in MapViewController:didDeselectAnnotationView 
      [self adjustMapRegionIfNeeded]; 
     } 
     [self animateIn]; 
    } 
} 
} 
+0

BasicMapAnnotationViewにはcalloutMapAnnotationというプロパティはありません。まだ追加されていないので、これを追加することはまだありません(nilは別として、現時点では到達できません)。多分私は何かを忘れた? – xci

+0

コード全体を提供することは可能でしょうか?私が何かを完全に見逃していない限り、どちらの部分もcalloutMapAnnotationはどちらの感知可能な値も与えられていません。あなたが追加したものを試しましたが、うまくいきませんでした。私はcalloutMapAnnotationプロパティが原因だと思っています。 – xci

関連する問題