Странные переводы координат широты / длины в положение экрана

#iphone #mkmapview #mapkit #mkannotation

#iPhone #mkmapview #mapkit #mkannotation

Вопрос:

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

 - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
    MKAnnotationView *aV;
    for (aV in views)
    {
        if (([aV.annotation isKindOfClass:[PostLocationAnnotation class]]) amp;amp; (((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 начальной точки на различные значения, но один коэффициент не выполняется для каждого значения начальной точки. Есть идеи, что происходит?

Ответ №1:

Рамка представления аннотации, похоже, основана на текущем уровне масштабирования, а затем смещена от экранных координат. Чтобы компенсировать это, компенсируйте 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);