Поворот MapView с использованием ориентации компаса - PullRequest
6 голосов
/ 07 августа 2009

Возможно ли иметь встроенный поворот MKMapView, чтобы всегда быть в том направлении, в котором находится iPhone? По сути, я хочу имитировать функцию поворота приложения «Карта» в моем собственном приложении.

Я вижу, что iPhone SDK не предоставляет функциональность. Однако мне интересно, сработает ли это, чтобы повернуть весь вид, используя CGAffineTransformMakeRotate. Повлияет ли это на касание и масштабирование? Есть ли лучший способ?

Ответы [ 5 ]

12 голосов
/ 27 марта 2012

Чтобы повернуть mapView, но не аннотации, вы можете использовать следующий код для компенсации вращения карт.

- (void)locationManager:(CLLocationManager *)manager
       didUpdateHeading:(CLHeading *)newHeading
{
  double rotation = newHeading.magneticHeading * 3.14159 / 180;
  CGPoint anchorPoint = CGPointMake(0, -23); // The anchor point for your pin

  [mapView setTransform:CGAffineTransformMakeRotation(-rotation)];

  [[mapView annotations] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    MKAnnotationView * view = [mapView viewForAnnotation:obj];

    [view setTransform:CGAffineTransformMakeRotation(rotation)];
    [view setCenterOffset:CGPointApplyAffineTransform(anchorPoint, CGAffineTransformMakeRotation(rotation))];

  }];

}

Еще одним решением является использование нового метода, который был добавлен в iOS 5 в MKMapView.

Взгляните на: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html

- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;

8 голосов
/ 21 сентября 2009

Я могу подтвердить, что он работает нормально. Вот код, который я использую:

[mapView setTransform:CGAffineTransformMakeRotation(-1 * currentHeading.magneticHeading * 3.14159 / 180)];

mapView это мой экземпляр MKMapView

2 голосов
/ 16 декабря 2016

Простое решение в Swift 3.0. Убедитесь, что строка введена в mapViewDidFinishLoadingMap, иначе она будет игнорироваться

public func mapViewDidFinishLoadingMap(_ mapView: MKMapView)
{
    mapView.setUserTrackingMode(.followWithHeading, animated: false)
}

Если вы не хотите, чтобы карта находилась в центре расположения пользователя, вы можете сделать что-то вроде этого

public func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading)
{
    if(CLLocationCoordinate2DIsValid(mapView.centerCoordinate))
    {
        mapView.camera.heading = newHeading.trueHeading
    }
}
1 голос
/ 08 августа 2009

Если вы посмотрите в Руководстве по программированию приложений iPhone 3.0 под Device Support, вы найдете информацию о магнитометре (он же компас). Как только вы начнете получать информацию о курсе (с помощью метода didUpdateHeading), вы сможете получить данные компаса, а затем использовать их для вычисления правильного значения преобразования вращения, которое будет применяться к представлению карты.

Не уверен, что обрабатывает масштабирование. В стандартном приложении карты я заметил, что отслеживание курса по компасу прекращается, как только вы начинаете масштабирование.

Кроме того, имейте в виду, что направления местоположения указаны в градусах, а углы поворота преобразования - в радианах.

0 голосов
/ 26 февраля 2014

если вы используете навигационный контроллер, попробуйте это:

//For Left button
 MKUserTrackingBarButtonItem *buttonItem = [[MKUserTrackingBarButtonItem 
                                                 alloc]initWithMapView:_mapView];

 self.navigationItem.leftBarButtonItem = buttonItem;


// For Right Button
     MKUserTrackingBarButtonItem *buttonItem = [[MKUserTrackingBarButtonItem 
                                                     alloc]initWithMapView:_mapView];

     self.navigationItem.rightBarButtonItem = buttonItem;
...