2013-08-11 10 views
0

Я хочу показать свои пользовательские аннотации на карте и мое текущее местоположение в качестве стандартного вывода на карте с синим цветом.стандартная аннотация карты для iOS

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
    static NSString *identifier = @"MapPin"; 
    if ([annotation isKindOfClass:[MyAnnotations class]]) { 
     MyAnnotations *ann= annotation; 
     MKAnnotationView *annotationView = (MKAnnotationView *) [self.map dequeueReusableAnnotationViewWithIdentifier:identifier]; 
     if (annotationView == nil) { 
      annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
      if (ann.custom){ 
       annotationView.image = [UIImage imageNamed:@"custom.png"]; 
      }else{ 
       //?? annotationView.image = [UIImage imageNamed:@"bluePin.png?"]; 
      } 
     } else { 
      annotationView.annotation = annotation; 
     } 
     if(ann.custom){ 
      UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      [nextButton addTarget:self action:@selector(annotationPicked) forControlEvents:UIControlEventTouchUpInside]; 
      annotationView.rightCalloutAccessoryView=nextButton; 
     } 
     annotationView.enabled = YES; 
     annotationView.canShowCallout = YES; 
     annotationView.multipleTouchEnabled = NO; 
     return annotationView; 
    } 
    return nil; 
} 

ответ

0

Если custom свойства различать аннотации и местоположение пользователя вида карты, в том, что дело уже обрабатываются первым if, который проверяет класс аннотации и custom свойства было бы ненужным.

вид карты в местоположение пользователя аннотации типа MKUserLocation так что код будет возвращать nil в этом случае и карта будет показана стандартная синяя точка (предполагая, что showsUserLocation является YES).


Однако, если custom свойство различать два типа ваших собственных аннотации, то одна проблема заключается в том, что она не обрабатывается повторно использоваться взгляды аннотаций правильно (при annotationView != nil).

Когда вид аннотаций повторно используется, его image и rightCalloutAccessoryView не может быть для текущего annotation так что эти свойства должны быть установлены (или очищен), является ли точка зрения быть повторно использован или нет. Например:

if ([annotation isKindOfClass:[MyAnnotations class]]) { 
    MyAnnotations *ann= annotation; 
    MKAnnotationView *annotationView = (MKAnnotationView *) [self.map dequeueReusableAnnotationViewWithIdentifier:identifier]; 
    if (annotationView == nil) { 
     annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
     annotationView.enabled = YES; 
     annotationView.canShowCallout = YES; 
     annotationView.multipleTouchEnabled = NO; 
    } else { 
     annotationView.annotation = annotation; 
    } 

    //set view properties that depend on annotation-specific properties 
    //regardless of whether view is new or re-used... 
    if (ann.custom) 
    { 
     annotationView.image = [UIImage imageNamed:@"custom.png"]; 

     UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     [nextButton addTarget:self action:@selector(annotationPicked) forControlEvents:UIControlEventTouchUpInside]; 
     annotationView.rightCalloutAccessoryView=nextButton; 
    } 
    else 
    { 
     annotationView.image = [UIImage imageNamed:@"bluePin.png"]; 
     annotationView.rightCalloutAccessoryView = nil; 
    } 

    return annotationView; 
} 

Хотя если custom свойства просто отделить всех аннотаций от местоположения пользователя вида карты, это ненужно в первую очередь (до тех пор, как вы проверяете аннотацию-х class и установить showsUserLocation в YES).

+0

Я просмотрел: else if ([аннотация isKindOfClass: [MKUserLocation class]]) { return nil; }, но нажатие на аннотацию аннотаций пользователя ... –

+0

Код, который вы пробовали в своем комментарии, кажется, не имеет отношения к вашему первоначальному вопросу, а также к сбою (для которого было бы полезно получить точное сообщение об исключении). – Anna

0

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

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
} 

Спасибо.

Смежные вопросы