他のすべての注釈の上に現在のユーザー注釈(青い点)を描画する必要があります。現在、他の注釈の下に描画され、非表示になっています。この注釈ビュー(青い点)のz-indexを調整して一番上に表示したいのですが、誰か知っていますか?
pdate:これで、MKUserLocationViewのハンドルを取得できますが、どのように転送しますか?
- (void) mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views {
for (MKAnnotationView *view in views) {
if ([[view annotation] isKindOfClass:[MKUserLocation class]]) {
// How do I bring this view to the front of all other annotations?
// [???? bringSubviewToFront:????];
}
}
}
Paul Tiarks の助けを借りて、ついに以下のコードを使用して動作させることができました。私が遭遇した問題は、MKUserLocationアノテーションが他のアノテーションよりも先にマップに追加されるため、他のアノテーションを追加すると、それらの順序がランダムに見え、MKUserLocationアノテーションの上に配置されることです。これを修正するには、他のすべての注釈を後ろに移動し、MKUserLocation注釈を前に移動する必要がありました。
- (void) mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views
{
for (MKAnnotationView *view in views)
{
if ([[view annotation] isKindOfClass:[MKUserLocation class]])
{
[[view superview] bringSubviewToFront:view];
}
else
{
[[view superview] sendSubviewToBack:view];
}
}
}
Update:以下のコードを追加して、地図の表示可能領域からスクロールしたときに青い点が上に描画されるようにすることができます。
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
for (NSObject *annotation in [mapView annotations])
{
if ([annotation isKindOfClass:[MKUserLocation class]])
{
NSLog(@"Bring blue location dot to front");
MKAnnotationView *view = [mapView viewForAnnotation:(MKUserLocation *)annotation];
[[view superview] bringSubviewToFront:view];
}
}
}
別の解決策:注釈ビューレイヤーのzPosition(_annotationView.layer.zPosition
_)を次の場所に設定します。
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
そのスレッドに対する公式の答えは間違っています... zPositionを使用することは、regionDidChangeAnimatedを使用するよりも確かに最良のアプローチであり、最速です...
そうしないと、マップ上の多くの注釈でパフォーマンスに大きな影響があります(フレームを変更するたびにすべての注釈が再スキャンされるため)。そしてそれをテストしています...
したがって、注釈のビューを作成するとき(またはdidAddAnnotationViewsで)set:self.layer.zPosition = -1; (他のすべての下に)
そしてyufが指摘したように:これは他のピンからのピンカバーコールアウトになります– yuf 2013年12月5日20:25
つまり、注釈ビューは他のピンの下に表示されます。
修正するには、選択したときにzPositionを0に戻すだけです。
-(void) mapView:(MKMapView*)mapView didSelectAnnotationView:(MKAnnotationView*)view {
if ([view isKindOfClass:[MyCustomAnnotationView class]])
view.layer.zPosition = 0;
...
}
-(void) mapView:(MKMapView*)mapView didDeselectAnnotationView:(MKAnnotationView*)view {
if ([view isKindOfClass:[MyCustomAnnotationView class]])
view.layer.zPosition = -1;
...
}
ユーザーの場所のアノテーションへの参照を取得してみてください(おそらくmapView: didAddAnnotationViews:
)次に、すべての注釈が追加された後、そのビューをmapViewの前面に移動します。
スウィフト3:
internal func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
for annotationView in views {
if annotationView.annotation is MKUserLocation {
annotationView.bringSubview(toFront: view)
return
}
annotationView.sendSubview(toBack: view)
}
}
.layer.anchorPointZ
プロパティを使用するだけです。
例:
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
views.forEach {
if let _ = $0.annotation as? MKUserLocation {
$0.layer.anchorPointZ = 0
} else {
$0.layer.anchorPointZ = 1
}
}
}
ここに参照があります https://developer.Apple.com/documentation/quartzcore/calayer/1410796-anchorpointz
Underscore.mの使用
_.array(mapView.annotations).
filter(^ BOOL (id<MKAnnotation> annotation) { return [annotation
isKindOfClass:[MKUserLocation class]]; })
.each(^ (id<MKAnnotation> annotation) { [[[mapView
viewForAnnotation:annotation] superview] bringSubviewToFront:[mapView
viewForAnnotation:annotation]]; });
これは、述語を使用してそれを行う方法です。もっと速いはずだと思います
NSPredicate *userLocationPredicate = [NSPredicate predicateWithFormat:@"class == %@", [MKUserLocation class]];
NSArray* userLocation = [[self.mapView annotations] filteredArrayUsingPredicate:userLocationPredicate];
if([userLocation count]) {
NSLog(@"Bring blue location dot to front");
MKAnnotationView *view = [self.mapView viewForAnnotation:(MKUserLocation *)[userLocation objectAtIndex:0]];
[[view superview] bringSubviewToFront:view];
}