【问题标题】:Rotate MapView using Compass orientation使用指南针方向旋转 MapView
【发布时间】:2009-08-07 15:36:44
【问题描述】:

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

我看到 iPhone SDK 没有公开该功能。但是,我想知道使用CGAffineTransformMakeRotate 旋转整个视图是否可行。它会影响点击和缩放吗?有没有更好的办法?

【问题讨论】:

    标签: iphone cocoa-touch iphone-3gs


    【解决方案1】:

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

    【讨论】:

    • 在iOS6中引入这个功能怎么样?我们可以向北旋转地图吗?我试图定位地图,但失败了。
    【解决方案2】:

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

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

    mapView 是我的 MKMapView 实例

    【讨论】:

    • 上面的代码可以旋转地图视图,但是注释呢?转换将如何应用于这些?
    • 我已经在下面发布了您问题的答案。
    【解决方案3】:

    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
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        如果你使用 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;
        

        【讨论】:

          猜你喜欢
          • 2013-01-23
          • 1970-01-01
          • 2011-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-03
          相关资源
          最近更新 更多