web-dev-qa-db-ja.com

MKAnnotationView-カスタム注釈ビューをロックして、場所の更新を固定します

アップデート#5バウンティタイムだと思います。私が投稿したコードサンプルを使用しても、100回以上のビューがあり、誰も刺されませんでした。評判ポイントはいかがですか!

アップデート#4これはかなり複雑な質問なので、問題のあるアプリの部分だけを含む新しいタブベースのプロジェクトを作成しましたここに。以下からダウンロードできます: http://www.servinitup.net/CustomCalloutAnnotation.Zip お気軽に開いて(携帯電話で実行するには独自のバンドル識別子を追加する必要があります)、遊んでみてくださいそれを使って、ピンと一緒に移動するためにそのひどいコールアウト注釈を取得できるかどうかを確認してください!

更新#3setAnnotationをチュートリアルのCalloutMapAnnotationViewのパブリックメソッドにして、それを直接呼び出してみました。運がなかった。少し奇妙なことが起こったにもかかわらず、動いたのは吹き出しの小さな三角形の部分だけでした。吹き出し全体を動かすことができませんでした。

アップデート#2まだあまり運がありませんが、プログラムで「ピンチしてズーム」を作成し、すぐに元に戻す方法を探しています。ユーザーには変更が表示されません。これをプログラムで実行すると、手動で実行するのと同じ効果が得られ、コールアウトアノテーションがその親にポップバックすることを期待しています。何か案は?

アップデート#1ここで遊んだ後、私は次のようになりました:-置換self.calloutAnnotation.coordinate = coords;self.calloutAnnotation.latitude = coords.latitude;self.calloutAnnotation.longitude = coords.longitude;-これを変更して、ピンが更新された後で地図を少しつまんでズームインまたはズームアウトすると、吹き出しの注釈がピンの真上で正しい位置にアニメーション化されます。

したがって、ユーザーが実際にピンチしてズームすることなく、これを実現する方法を理解する必要があります。


元の投稿

私は、他のSOユーザーと一緒に、このすばらしいソリューションを使用して、カスタムコールアウトアノテーションを作成しています: http://blog.asolutions.com/2010/09/building-custom -map-annotation-callouts-part-1 /

標準の吹き出し(annotationview.canShowCallout = true)を使用し、場所が更新されるとピンが画面上を移動すると、標準の吹き出しは、ピンと一緒にロックされているかのように追跡します。

上記のカスタムコールアウトソリューションを使用している場合、場所の更新後にピンが移動すると、コールアウトアノテーションは元の場所に残ります。もちろん、iOS標準を模倣し、ピンと一緒にカスタムコールアウト注釈トラックを作成したいと思います。

これまでのコードは次のとおりです。これはアノテーションビューを正常に移動しますが、カスタムコールアウトアノテーションビューは移動しません。

/*コアロケーションは通知をブロードキャストし、ビューコントローラーはその通知をリッスンしてlocationManagerDidFindLocationを呼び出します*/
-(void)locationManagerDidFindLocation:(NSNotification *)notif {
 CLLocation * location = [notif.userInfo objectForKey:@ "location"]; 
 CLLocationCoordinate2D coords = [場所座標]; 
 MKCoordinateSpan span = MKCoordinateSpanMake((5/69)、(5/69)); 
 MKCoordinateRegion region = {coords、span}; 
 
 //現在の場所がまだない場合は、場所を作成して地図上に配置し、地図の場所を調整しますregion 
 //それ以外の場合は、スムーズなアニメーションで注釈の配置と地図の位置を更新します
 if(self.currentLocationAnnotation == nil){
 self.currentLocationAnnotation = [[CurrentLocationAnnotation alloc] initWithCoordinate:coords andTitle:@ "My Title" andSubtitle:@ "Mysubtitle"]; 
 
 [self.mapView addAnnotation:self.currentLocationAnn otation]; 
 [self.mapView setRegion:regionanimated:true]; 
 [self.mapView regionThatFits:region]; 
} else {
 [UIView beginAnimations :nil context:NULL]; 
 [UIView setAnimationDuration:0.45]; 
 [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
 
 //これにより注釈ビューが完全に移動します
 self.currentLocationAnnotation.coordinate = coords; 
 
 // *******これが私の問題の場所です
 // ****** *このカスタムコールアウト注釈ビューは
 // *******元の場所にとどまります
 // *******親注釈ビューはscreen 
 self.calloutAnnotation.coordinate = coords; 
 
 [self.mapView setRegion:regionanimated:true]; 
 [self.mapView regionThatFits:region]; 
 [UIView commitAnimations]; 
} 
} 
30
djibouti33

custom callout

CalloutMapAnnotationViewに基づいて、IBベースのソリューションを示すプロジェクトを作成しました。矢印キーは、位置注釈とその吹き出し注釈の動きをアニメーション化します。コールアウトも、提供されたcontentViewに基づいて自動的にサイズ変更され、ビューは別のペン先から読み込まれます。幸運を!

https://github.com/jacobjennings/JJMapCallout

32
Jacob Jennings

コードを確認します。新しいカスタムMKAnnotationViewを作成し、両方のビュー(ピンとコールアウト)をカプセル化することをお勧めします。

ただし、現在のコードについては、承認された応答を読むことを検討してください。この質問: MKMapViewは注釈を自動的に移動します-アニメーション化しますか?

乾杯。

1
CHiRo79

私はあなたがこの答えを気に入らないことを知っています、しかしそれはうまくいきます。リンクしたサンプルは、可能な限り最も難しい方法(drawRect :)を使用して、オーバーレイにカスタム画像を描画するだけです。オーバーレイを一度UIImageにレンダリングし、非常に単純なMKAnnotationViewでimageプロパティを設定することを検討しましたか?バーの友達の数を更新するなど、コンテンツを定期的に変更する必要がある場合でも、変更が発生したときに画像を再描画して、適切なMKAnnotationViewを更新できます。

1
RyanR