7

是否有可能让嵌入式MKMapView旋转始终面向 iPhone 所面对的方向?基本上我想在我自己的应用程序上模仿地图应用程序旋转功能。

我看到 iPhone SDK 没有公开该功能。但是,我想知道使用CGAffineTransformMakeRotate. 它会影响点击和缩放吗?有没有更好的办法?

4

5 回答 5

13

要旋转 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;

于 2012-03-27T14:10:05.363 回答
8

我可以确认它工作正常。这是我正在使用的代码:

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

mapView是我的 MKMapView 实例

于 2009-09-21T18:59:46.810 回答
2

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
    }
}
于 2016-12-16T13:53:39.030 回答
1

如果您查看下面的 3.0 iPhone 应用程序编程指南,Device Support您将找到有关磁力计(又名指南针)的信息。一旦开始获取航向信息(通过该didUpdateHeading方法),您应该能够获取指南针数据,然后使用它来计算正确的旋转变换值以应用于地图视图。

不确定它是否可以处理缩放。在标准地图应用程序中,我注意到一旦您开始捏缩放,指南针航向跟踪就会停止。

另外,请记住,位置方向以度为单位,而变换旋转角度以弧度为单位。

于 2009-08-07T20:38:57.947 回答
-2

如果您使用 navigationVontroller 试试这个:

//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;
于 2014-02-25T20:58:39.300 回答