5

我试图得到它,以便当您旋转 iOS 7 地图时,注释会随相机航向一起旋转。想象一下,我有必须始终指向北方的 pin 注释。

起初这看起来很简单,应该有一个 MKMapViewDelegate 用于获取相机旋转,但没有。

我已经尝试使用地图代表来查询地图视图的camera.heading对象,但首先这些代表似乎只在旋转手势之前和之后被调用一次:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

我也尝试在 camera.heading 对象上使用 KVO,但这不起作用,并且相机对象似乎是某种代理对象,只有在旋转手势完成后才会更新。

到目前为止,我最成功的方法是添加一个旋转手势识别器来计算旋转增量,并将其与区域更改委托开始时报告的相机航向一起使用。这在一定程度上有效,但在 OS 7 中,您可以“轻弹”您的旋转手势,它增加了我似乎无法跟踪的速度。有什么方法可以实时跟踪摄像机的航向吗?

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    heading = self.mapView.camera.heading;
}

- (void)rotationHandler:(UIRotationGestureRecognizer *)gesture
{
    if(gesture.state == UIGestureRecognizerStateChanged) {

        CGFloat headingDelta = (gesture.rotation * (180.0/M_PI) );
        headingDelta = fmod(headingDelta, 360.0);

        CGFloat newHeading = heading - headingDelta;

        [self updateCompassesWithHeading:actualHeading];        
    }
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    [self updateCompassesWithHeading:self.mapView.camera.heading];
}
4

1 回答 1

3

遗憾的是,Apple 不会实时更新任何地图信息。你最好的办法是设置一个 CADisplayLink 并在它发生变化时更新你需要的任何东西。像这样的东西。

@property (nonatomic) CLLocationDirection *previousHeading;
@property (nonatomic, strong) CADisplayLink *displayLink;


- (void)setUpDisplayLink
{
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkFired:)];

    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}


- (void)displayLinkFired:(id)sender
{
   double difference = ABS(self.previousHeading - self.mapView.camera.heading);

   if (difference < .001)
       return;

   self.previousHeading = self.mapView.camera.heading;

   [self updateCompassesWithHeading:self.previousHeading];
}
于 2013-10-03T23:47:32.293 回答