2012-04-09 2 views
1

Я пытаюсь добавить расстояние от позиции пользователя к выбранному субтитрам аннотации в mapview. Механика работы работает, но фактическая выноска становится беспорядочной в первый раз, когда она отображается. Кажется, проблема с перерисованием.iOS SDK Mapview Аннотации выносят ошибку перерисовывания

mapView annotation redraw problem

Последующие краны на штифте показывают правильное расположение.

Вот соответствующий код:

// вызывается при выборе аннотаций

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

MKPointAnnotation *selectedAnnotation = view.annotation; 

//attempt to add distance on annotation 
CLLocation *pointALocation = [[CLLocation alloc] 
           initWithLatitude:selectedAnnotation.coordinate.latitude 
           longitude:selectedAnnotation.coordinate.longitude]; 
float distanceMeters = [pointALocation distanceFromLocation:locationManager.location]; 

//for sending info to detail 
myPinTitle = selectedAnnotation.title; 

[selectedAnnotation setSubtitle:[NSString stringWithFormat:@"%.2f miles away", (distanceMeters/1609.344)]]; 

} Я пытался дозвониться [Просмотр setNeedsDisplay], но безрезультатно.

Заранее за вашу помощь.


Решение, что работал

Вот решение, которое я наконец придумал. Кажется, это работает.

Я вырезан код дубликата от метода didSelectAnnotationView, выше, и придумал:

//called when user location changes 

- (void)updatePinsDistance 
{ 
for (int x=0; x< [[mapView annotations]count]; x++) { 
    MKPointAnnotation *thisPin =[[mapView annotations] objectAtIndex:x]; 

    //attempt to add distance on annotation 
    CLLocation *pointALocation = [[CLLocation alloc] 
           initWithLatitude:thisPin.coordinate.latitude 
           longitude:thisPin.coordinate.longitude]; 
    float distanceMeters = [pointALocation distanceFromLocation:locationManager.location]; 
    NSString *distanceMiles = [NSString stringWithFormat:@"%.2f miles from you", 
                (distanceMeters/1609.344)]; 

    [thisPin setSubtitle:distanceMiles]; 
    } 
} 

ответ

3

Вы должны установить субтитры в другом месте, чем didSelectAnnotationView. Фактически все аннотации должны иметь свой заголовок и набор субтитров перед их возвратом методом mapView: viewForAnnotation:.

Тот факт, что вы установили длинный субтитр, безусловно, объясняет, что выноска не соответствует размеру. Размер должен быть рассчитан до вызова didSelectAnnotationView.

+0

Оригинальный субтитр добавляется при создании аннотаций, но я хочу показать расстояние от текущего местоположения пользователя до выбранной точки, поэтому я не могу добавить эту информацию. Кроме того, замещенная строка расстояния может быть фактически меньше первоначальной. –

+0

Вместо этого вы должны пересчитать его при изменении местоположения пользователя с помощью метода mapView: didUpdateUserLocation: delegate. Честно говоря, изменение субтитров при показе выноски не является разумным делом. –

+0

Итак, следует ли менять субтитры каждой аннотации, когда позиция пользователя изменяется, даже если она никогда не будет видна, а не только та, которая должна отображаться? Я смущен, как это разумнее. Можете ли вы уточнить? Благодарю. –

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