web-dev-qa-db-ja.com

iOSMapKitユーザーの場所の注釈のZインデックス

他のすべての注釈の上に現在のユーザー注釈(青い点)を描画する必要があります。現在、他の注釈の下に描画され、非表示になっています。この注釈ビュー(青い点)の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:????];
        }
    }
}
32
jmcopeland

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];
    }
  }
}
34
jmcopeland

別の解決策:注釈ビューレイヤーのzPosition(_annotationView.layer.zPosition_)を次の場所に設定します。

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;

25
hrchen

そのスレッドに対する公式の答えは間違っています... 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;
   ...
}
9
altagir

ユーザーの場所のアノテーションへの参照を取得してみてください(おそらくmapView: didAddAnnotationViews:)次に、すべての注釈が追加された後、そのビューをmapViewの前面に移動します。

2
Paul Tiarks

スウィフト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)
        }
 }
1
aBikis

.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

0
Michael Henry

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]]; });
0
bilby91

これは、述語を使用してそれを行う方法です。もっと速いはずだと思います

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];
}
0
adrian.coroian