2014-01-30 2 views
4

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

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

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

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

Любые идеи? Благодаря!

ответ

1

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

MKCoordinateRegion currentRegion = MKCoordinateRegionMake(center, span); 

double 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:]

Мое решение было адаптационном этот ответ https://stackoverflow.com/a/21034410/1130983, где он использует несколько простых триг для определения высоты , предполагая, что карта camara имеет угол обзора 30 градусов. Однако вместо того, чтобы проходить в полигоне, я непосредственно передаю MKMapRect:

- (double)determineAltitudeForMapRect:(MKMapRect)boundingRect withHeading:(double)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)); 

    double adjacent; 

    if (boundingRect.size.height > boundingRect.size.width) 
    { 
     adjacent = vDist/2; 
    } 
    else 
    { 
     adjacent = hDist/2; 
    } 

    double result = adjacent/tan(DEGREES_TO_RADIANS(15)); 
    return result; 
} 
Смежные вопросы