Странные переводы координат широты / долготы в положение экрана - PullRequest
3 голосов
/ 27 октября 2011

В моем приложении есть карта, которая отображает 2 вида аннотаций: местоположения и группы местоположений.Когда я увеличиваю кластер, кластер расширяется, чтобы показать местоположения, содержащиеся в кластере.Когда эти местоположения добавляются на карту, координаты их родительского кластера сохраняются в объекте аннотации.То, что я хочу сделать, это иметь анимацию, чтобы при добавлении этих местоположений они распространялись из местоположения их родительского кластера.Вот мой код для mapView: didAddAnnotationViews:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
    MKAnnotationView *aV;
    for (aV in views)
    {
        if (([aV.annotation isKindOfClass:[PostLocationAnnotation class]]) && (((PostLocationAnnotation *)aV.annotation).hasParent))
        {
            CLLocationCoordinate2D startCoordinate = ((PostLocationAnnotation *)aV.annotation).parentCoordinate;

            CGPoint startPoint = [ffMapView convertCoordinate:startCoordinate toPointToView:self.view];

            CGRect endFrame = aV.frame;

            aV.frame = CGRectMake(startPoint.x, startPoint.y, aV.frame.size.width, aV.frame.size.height);

            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:1.00];
            [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
            [aV setFrame:endFrame];
            [UIView commitAnimations];

            ((PostLocationAnnotation *)aV.annotation).hasParent = NO;
        }
    }
}

Это, кажется, заставляет точки карты лететь из некоторого места далеко за пределами фокуса вида.С помощью отладки я обнаружил, что существует огромное расхождение между значениями для endFrame.origin и startPoint - для одного конкретного aV endFrame.origin выглядит как (32657,21781) (оба CGFloats), а startPoint выглядит как (159.756256,247.213226) (опять же оба CGFloats).Я предполагаю, что endFrame.origin - правильное значение, поскольку точки заканчиваются там, где я хочу, они просто приходят откуда-то издалека.Я использовал convertCoordinate: toPointToView: метод во многих других частях моего кода, и у меня не было проблем.Я также пытался умножить значения X и Y startPoint на различные значения, но один коэффициент не выполняется для каждого значения startPoint.Есть идеи, что происходит?

1 Ответ

2 голосов
/ 27 октября 2011

Кажется, что рамка представления аннотации основана на текущем уровне масштабирования, а затем смещена относительно координат экрана.Чтобы компенсировать это, сместите startPoint на annotationVisibleRect.origin.

. Кроме того, при вызове convertCoordinate:toPointToView: я думаю, что безопаснее конвертировать в кадр вида карты вместо self.view, так как вид картыможет отличаться от размера контейнера.

Попробуйте следующие изменения:

CGPoint startPoint = [ffMapView convertCoordinate:startCoordinate 
                                    toPointToView:ffMapView];
//BTW, using the passed mapView parameter instead of referencing the ivar 
//would make the above line easier to re-use.

CGRect endFrame = aV.frame;

aV.frame = CGRectMake(startPoint.x + mapView.annotationVisibleRect.origin.x,
                      startPoint.y + mapView.annotationVisibleRect.origin.y,
                      aV.frame.size.width, 
                      aV.frame.size.height);
...