Search code examples
iphonecocoa-touchiphone-3gs

Rotate MapView using Compass orientation


Is it possible to have an embedded MKMapView rotate to always face the direction the iPhone is facing? Basically I want to mimic the Map app rotation feature on my own app.

I see that the iPhone SDK does not expose the functionality. However, I wonder if it would work to rotate the entire view using CGAffineTransformMakeRotate. Would it affect tapping and zooming? Is there a better way?


Solution

  • To rotate the mapView but not the annotations you could use the following code to compensate for the maps rotation.

    - (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))];
    
      }];
    
    }
    

    Another sollution is using a new method that has been added in iOS 5 to MKMapView.

    Take a look at: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html

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