выноска iphone — MKMapView не отображается на iPhone 4 с iOS 4.1

#iphone #map #annotations #callouts

#iPhone #словарь #примечания #выноски

Вопрос:

У меня проблема с MKMapView. Я добавляю подобные аннотации:

 // set up new points
for(int i = 0; i < [_locations count]; i  ) {
    PPlace * place = [_locations objectAtIndex:i];
    PlaceAnnotation * placeAnnotation = [[PlaceAnnotation alloc] initWithPlace:place];
    // if annotation is for currently selected place
    placeAnnotation.isCurrent = i == currentIndexPath.row;
    [self.mapView addAnnotation:placeAnnotation];
    if (placeAnnotation.isCurrent) {
        [self.mapView selectAnnotation:placeAnnotation animated:YES];
    }
    [placeAnnotation release];
}
  

Поэтому я стараюсь отображать размер выноски сразу после добавления, а не после нажатия на значок аннотации.
В симуляторе все работает нормально, также на iPhone 3GS с iOS 4.3.2. Однако выноски не отображаются на iPhone 4 с iOS 4.1 (они отображаются только после нажатия pin-кода). Есть идеи, как это решить?

Комментарии:

1. Можете ли вы опубликовать свою реализацию PlaceAnnotation ? Возможно, свойство title возвращает пустую строку.

2. Вам нужно установить title свойство для вашего объекта аннотации.

Ответ №1:

Я предполагаю, что вы не присвоили значение свойству title вашего класса аннотаций. Даже если вы можете установить canShowCallout значение YES , всплывающее окно вызова не будет отображаться, если у вас нет чего-либо в названии.

Комментарии:

1. Я назначаю заголовок и субтитры. Если бы я этого не сделал, выноска никогда бы не появилась, неважно, на симуляторе или устройстве. Но она появляется, например, в симуляторе или на iPhone 3GS с iOS 4.3.2.

Ответ №2:

попробуйте добавить

 placeAnnotation.canShowCallout = YES;
  

итак, это выглядит так:

 // set up new points
for(int i = 0; i < [_locations count]; i  ) {
    PPlace * place = [_locations objectAtIndex:i];
    PlaceAnnotation * placeAnnotation = [[PlaceAnnotation alloc] initWithPlace:place];
    // if annotation is for currently selected place
    placeAnnotation.isCurrent = i == currentIndexPath.row;
    [self.mapView addAnnotation:placeAnnotation];
    if (placeAnnotation.isCurrent) {
        [self.mapView selectAnnotation:placeAnnotation animated:YES];
        placeAnnotation.canShowCallout = YES;
    }
    [placeAnnotation release];
}
  

надеюсь, это поможет!
WeSaM

Комментарии:

1. Это не сработает, потому что placeAnnotation не является производным от MKAnnotationView . Это всего лишь подкласс NSObject.

2. У меня также есть класс PlaceAnnotationView, который является подклассом MKAnnotationView, созданный в — (MKAnnotationView *)MapView: (MKMapView *)MapView viewForAnnotation: (идентификатор<MKAnnotation>) аннотации, и я устанавливаю там canShowCallout = YES. Это не работает.

3. Установите заголовок для MKPointAnnotation объекта, используемого для представления структуры данных pin.

Ответ №3:

Вам нужно будет реализовать следующий метод:

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

Документацию можно найти здесь

Ответ №4:

Вы вызываете ее в неподходящее время. Вы не сможете выбрать ее до тех пор, пока она не загрузится.

Используйте метод делегирования MKMapView:

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

И изнутри этого вызова метода:

 [yourMapView selectAnnotation: yourAnnotation animated: YES];