#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];