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