如何减缓MKMapCamera运动?

时间:2013-10-01 03:40:53

标签: ios objective-c mkmapview catransaction

我在iOS编码。

我有一个NSArray,其中包含一些MKMapCameras。我想一个接一个地从数组中显示MKMapCameras。

我放了一个while循环并使用[self.mapView setCamera:nextCamera animated:YES];

但是,这只显示了第一个和最后一个视图。介于两者之间的一切都太快了。

我想减慢每个相机的移动速度。有没有办法使用CATransaction或使用任何其他动画技巧来实现它。如果是这样,你能告诉我一个示例代码吗?

想要提供更新...我尝试了下面的代码。但它不起作用......正如我前面提到的那样,相机移动速度很快。

[CATransaction begin];
[CATransaction setAnimationDuration:5.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[CATransaction setCompletionBlock:^{
    [self.mapView setCamera:nextCamera animated:YES];
}];
[CATransaction commit];

2 个答案:

答案 0 :(得分:5)

在摆弄了几个小时之后,我找到了一种方法让它发挥作用。想与大家分享......

我做了两处修改。我用UIView的动画取代了CATransaction。我还删除了Camera的默认动画设置,这与UIView的动画相冲突。

以下是代码。

[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:2.5];
self.mapView.camera = nextCamera;
[UIView commitAnimations];

答案 1 :(得分:2)

根据WWDC“放置MapKit in Perspective”视频,您应该避免使用完成处理程序按顺序为地图相机设置动画。相反,您应该在地图视图上设置一个委托并监听regionDidChangeAnimated:call以触发序列中的下一个摄像头。这样,可以通过animateWithDuration控制相机移动的速度:

-(void)flyToLocation:(CLLocationCoordinate2D)toLocation {


    CLLocationCoordinate2D startCoord = self.mapView.camera.centerCoordinate;

    CLLocationCoordinate2D eye = CLLocationCoordinate2DMake(toLocation.latitude, toLocation.longitude);


    MKMapCamera *upCam = [MKMapCamera cameraLookingAtCenterCoordinate:startCoord
                                                        fromEyeCoordinate:startCoord
                                                              eyeAltitude:80000];


    MKMapCamera *turnCam = [MKMapCamera cameraLookingAtCenterCoordinate:toLocation
                                                        fromEyeCoordinate:startCoord
                                                              eyeAltitude:80000];

    MKMapCamera *inCam = [MKMapCamera cameraLookingAtCenterCoordinate:toLocation
                                                        fromEyeCoordinate:eye
                                                              eyeAltitude:26000];

    self.camerasArray = [NSMutableArray arrayWithObjects:upCam, turnCam, inCam, nil];

    [self gotoNextCamera];

}

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [self gotoNextCamera];
}

-(void)gotoNextCamera {

    if (self.camerasArray.count == 0) {
        return;
    }

    MKMapCamera *nextCam = [self.camerasArray firstObject];
    [self.camerasArray removeObjectAtIndex:0];

    [UIView animateWithDuration:3.0 animations:^{
        self.mapView.camera = nextCam;
    }];

}