MKMapView: как вывести MKUserLocationView (синяя точка) на передний план? - PullRequest
3 голосов
/ 04 декабря 2010

Я добавляю пользовательскую аннотацию вместо аннотации булавки.По сути, я рисую круг в этих аннотациях и добавляю их на карту.Проблема в том, что эти пользовательские аннотации скрывают представление о местоположении пользователя (синяя точка).

- (void)mapView:(MKMapView *)mapView 
didUpdateUserLocation:(MKUserLocation *)userLocation 
{
UIView *user = [mapView viewForAnnotation:userLocation];
[mapView bringSubviewToFront:user];
}

Однако, это не работает для меня.Синяя точка пользователя все еще покрыта моими пользовательскими аннотациями.Любые идеи, как я могу заставить представление местоположения пользователя появляться впереди?Приветствия

Ответы [ 4 ]

6 голосов
/ 18 августа 2011

Попробуйте, все работает.

MKAnnotationView *userLocationView = [self.mapView viewForAnnotation:self.mapView.userLocation];
[userLocationView.superview bringSubviewToFront:userLocationView];
3 голосов
/ 11 сентября 2011

Я сделал это так:

- (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];
        }
    }
}
0 голосов
/ 11 марта 2011

Ответ Ортвина не сработал для меня.MKUserLocationView никогда не находится в этом массиве (по крайней мере, в моем тестировании).

Вместо этого получите значение из экземпляра MKMapView напрямую.Вот так:


if (self.userLocationAnnotationView != nil && self.mapView.userLocation != nil) {
  self.userLocationAnnotationView = [self.mapView viewForAnnotation:self.mapView.userLocation];
}

"userLocationAnnotationView" - это ивар, который есть в моем контроллере вида:

MKAnnotationView *userLocationAnnotationView;
@property (nonatomic, retain) MKAnnotationView *userLocationAnnotationView;

Когда вы запускаете этот код, текущее представление местоположения должно быть уже добавлено.Это не может иметь место в viewDidLoad по ряду причин, включая: a) пока нет обновлений GPS b) текущее местоположение находится за пределами экрана.Я запускаю этот код в:

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading

Удачи!

0 голосов
/ 10 февраля 2011

Обычно вы хотели бы иметь представление userLocation сзади. По крайней мере, это нормальное поведение для mapView с булавками.

Если вы действительно хотите вывести его на передний план, вам нужно узнать реальное представление userLocation. Я полагаю, что [mapView viewForAnnotation:userLocation] не дает вам реальное представление userLocation (вы проверяли, что это не nil?). Я бы добавил -mapView:didAddAnnotationViews: к вашему MKMapViewDelegate так:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
    for (id view in views) {
        if (![view isKindOfClass:[YourCustomAnnotationView class]]) {
            self.userLocationView = view;
        }
    }
}
...