вращение iOS MKAnnotationView в ответ на вращение MKMapView - PullRequest
0 голосов
/ 28 сентября 2011

В моем приложении у меня есть MKMapView, где отображаются несколько аннотаций. Карта вращается в зависимости от заголовка устройства. Чтобы повернуть карту, выполняется следующая инструкция (вызывается методом locationManager: didUpdateHeading:)

self.navigationMapView.mapView.transform = CGAffineTransformMakeRotation(-heading);

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

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

    static NSString *identifier = @"AnnotationViewIdentifier";

    MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if (av == nil) {
        av = [[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
    }
    else{
        av.annotation = annotation;
    }

    av.transform = CGAffineTransformMakeRotation(degreesToRadians(self.arController.currentHeading.magneticHeading)); 

    av.canShowCallout = YES;
    return av;

} 

и я хочу вызвать этот метод из "didUpdateHeading:", но я действительно не знаю, как это сделать. Класс TableView имеет функцию reloadData, которая вызывает метод делегата, но здесь все выглядит иначе. Какие-либо предложения?!

Еще один вопрос, мои аннотации на карте показывают расстояние от пользователя, я хотел бы обновить их (метку расстояния), как только пользователь изменит местоположение. Есть предложения?!

1 Ответ

1 голос
/ 28 сентября 2011

Так что, если MKMapView правильно вызывать, это немного раздражает.По сути, у вас есть один из двух вариантов.Вариант 1. Создайте массив комментариев на экране и удалите их из map_view, а затем повторно добавьте их в map_view.По сути, создание вашей собственной функции перезагрузки данных.Вариант 2: Сделайте что-нибудь простое, например

CGLocationCoordinate2D coordinate = map_view.center;
 map_view.center = coordinate;

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

[my_map_view removeFromSuperView];
[my_map_view release];
my_map_view = nil;
my_map_view = [[MKMapView alloc] initWithFrame:CGRectMake(0,0,320,480)];

один из этих вариантов должен работать.Мне пришлось сделать первый вариант для моего решения, однако я знаю, что некоторым людям повезло, и второй вариант тоже работает.

...