IOS 6 MkMapView сохраняет вращение при изменении области

В iOS 6 я пытаюсь реализовать возможность изменения области MkMapView без изменения вращения.

В принципе, мне нужно иметь возможность перемещать карту, чтобы отобразить область (и, следовательно, установить масштаб), но также я не хочу поворачивать карту, когда я вызываю [mapView setRegion:].

[mapView setCenterCoordinate:] работает хорошо, но не позволяет изменять уровень масштабирования.

В iOS 7 я использую [mapView setCamera:], где у меня есть камера с центральной координатой и указанным уровнем масштабирования... Мне в основном нужна эта функциональность в iOS 6.

Любые идеи? Спасибо!

1 ответ

У меня была такая же проблема, и я полностью отказался от метода [mapView setRegion:] в пользу [mapView setCamera:], используя исходную область и заголовок в качестве основы для ориентации камеры.

MKCoordinateRegion currentRegion = MKCoordinateRegionMake(center, span);
****** altitude = [self determineAltitudeForMapRect:MKMapRectForCoordinateRegion(currentRegion) withHeading:_heading andWithViewport:[[UIScreen mainScreen] bounds].size];
MKMapCamera *currentCamera = [MKMapCamera new];
[currentCamera setHeading:_heading];
[currentCamera setCenterCoordinate:center];
[currentCamera setAltitude:altitude];
[_mapView setCamera:currentCamera];

Трюк с этой опцией заключался в том, как определить значение [currentCamera setAltitude:], которое обычно устанавливалось автоматически с помощью [mapView setRegion:]

Мое решение было адаптацией этого ответа qaru.site/questions/1521093/..., где он использует некоторый простой триггер для определения высоты, предполагая, что карта camara имеет угол обзора 30 градусов. Однако, вместо передачи в многоугольник, я непосредственно передаю MKMapRect:

- (******)determineAltitudeForMapRect:(MKMapRect)boundingRect withHeading:(******)heading andWithViewport:(CGSize)viewport
{
 // Get a bounding rectangle that encompasses the polygon and represents its
 // true aspect ratio based on the understanding of its heading.
 MKCoordinateRegion boundingRectRegion = MKCoordinateRegionForMapRect(boundingRect);
 // Calculate a new bounding rectangle that is corrected for the aspect ratio
 // of the viewport/camera -- this will be needed to ensure the resulting
 // altitude actually fits the polygon in view for the observer.
 CLLocationCoordinate2D upperLeftCoord = CLLocationCoordinate2DMake(boundingRectRegion.center.latitude + boundingRectRegion.span.latitudeDelta / 2, boundingRectRegion.center.longitude - boundingRectRegion.span.longitudeDelta / 2);
 CLLocationCoordinate2D upperRightCoord = CLLocationCoordinate2DMake(boundingRectRegion.center.latitude + boundingRectRegion.span.latitudeDelta / 2, boundingRectRegion.center.longitude + boundingRectRegion.span.longitudeDelta / 2);
 CLLocationCoordinate2D lowerLeftCoord = CLLocationCoordinate2DMake(boundingRectRegion.center.latitude - boundingRectRegion.span.latitudeDelta / 2, boundingRectRegion.center.longitude - boundingRectRegion.span.longitudeDelta / 2);
 CLLocationDistance hDist = MKMetersBetweenMapPoints(MKMapPointForCoordinate(upperLeftCoord), MKMapPointForCoordinate(upperRightCoord));
 CLLocationDistance vDist = MKMetersBetweenMapPoints(MKMapPointForCoordinate(upperLeftCoord), MKMapPointForCoordinate(lowerLeftCoord));
 ****** adjacent;
 if (boundingRect.size.height > boundingRect.size.width)
 {
 adjacent = vDist / 2;
 }
 else
 {
 adjacent = hDist / 2;
 }
 ****** result = adjacent / tan(DEGREES_TO_RADIANS(15));
 return result;
}

licensed under cc by-sa 3.0 with attribution.