MKAnnotationView для пользователя Пин-код местоположения iPhone

У меня есть приложение, которое использует MKMapView, и в какой-то момент в приложении мне нужно удалить все текущие контакты на карте, используя

[mapView removeAnnotations:mapView.annotations]

И затем я хочу снова показать текущее местоположение пользователя

mapView.showUserLocation = YES

Но я могу заставить его снова появиться как обычный контакт, потому что класс представления userLocation не является общедоступным, поэтому я не могу вернуть представления этого типа. Вот мой код

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id<MKAnnotation>)annotation

MKPinAnnotationView* annView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"currentloc"];

if (!annView) {
   MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];
  annView.pinColor = MKPinAnnotationColorRed;
  annView.animatesDrop=TRUE;
  annView.canShowCallout = YES;
  annView.calloutOffset = CGPointMake(-5, 5);
  if ([annotation isKindOfClass:[DraggableAnnotationAM class]] ) annView.draggable =YES;
  return annView;

}
else {
  if ([annotation isKindOfClass:[DraggableAnnotationAM class]] ) annView.draggable =     YES;
  annView.annotation = annotation;
  return annView;
 }

Также я обнаружил через размышления, что

MKUserLocationView

- это класс, который используется для отображения текущего местоположения, но поскольку он не общедоступен, его небезопасно использовать, и мое приложение продолжает давать сбой, и я уверен, что есть более простой способ.

Можно ли делать то, что я хочу, или мне просто никогда не следует удалять аннотацию местоположения пользователя в mapView?

заранее спасибо


person Mauricio Galindo    schedule 31.12.2010    source источник


Ответы (2)


Попробуйте сделать это с помощью NSMutableArray. Надеюсь, это поможет вам решить вашу проблему!

 NSMutableArray *annotation = [[NSMutableArray alloc] init];
 for (id <MKAnnotation> annot_ in [mapView annotations])
 {
     if ( [annot_ isKindOfClass:[MKUserLocation class]] ) {
     }
     else {
         [annotation addObject:annot_];
     }
 }

 [mapView removeAnnotations:annotation];   
 [annotation release];   
 annotation = nil;
person Krismutt    schedule 02.01.2011

Если вы хотите отображать только синюю точку для местоположения пользователя вместо обычного булавки, верните nil в этой функции делегата mapView. В качестве альтернативы верните свой собственный объект MKAnnotationView (подкласс):

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        if annotation is MKUserLocation {
            return nil // or return a custom MKAnnotationView
        } else { // etc.
person Zoef    schedule 18.01.2017